书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令

参加书生.浦江大模型实战训练营,学习大模型知识和微调技术,所有课程免费,通过闯关的形式学习,也比较有趣。一起来了解LLM的世界。邀请链接

产品简介

InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持,为开发者提供开箱即用的大语言模型微调环境、工具、数据集,并完美兼容 🤗 HugginFace 开源生态。更多了解可通过官网文档了解。

基础知识

1、名词解释

1.云原生名词

云原生 (Clould - Native)
  • 云原生应用程序通常借助容器、微服务架构、自动化、持续集成/持续交付(CI/CD)等现代技术和实践来提供更高的敏捷性、可靠性和可扩展性。
(Docker) 容器
  • 在 InternStudio 中您使用的开发机就是一个 Docker 容器。容器中通常包含运行一个应用程序的依赖,并且实现了计算资源的隔离。
(Docker) 镜像
  • Docker 镜像是容器的构建模块,可以理解为容器的运行环境。它是一个轻量级的、可执行的软件包,包括了软件所需的依赖项和配置文件。因此,docker 镜像非常适合应用为模型训练的开发环境,帮助用户进行敏捷的环境切换。

2.微调名词

SFT (Supervised-Finetuning)

  • SFT 是有监督微调的缩写,通常用于针对特定任务或应用程序微调预训练(基座)的深度学习模型,如 BERT、GPT、或其他自然语言处理(NLP)或计算机视觉模型,从而通过更少量的数据,训练更少的参数以达到快速适配下游任务的效果。
PEFT (Parameter-Efficient Finetuning)
  • 是伴随大模型兴起的一种参数友好型微调方法。与传统的全量微调模型参数、微调模型部分参数不同,PEFT 类型的微调方法具有参与训练参数数量少、对硬件资源依赖小且效果与传统微调方法相当的特点。Xtuner 库支持了目前使用的最主流 PEFT 方法:LORA、QLORA
LORA (Low Rank Adaption of LLM)
  • 目前最主流的大模型微调方法之一,特点是将模型中的权重矩阵低秩分解,分解成2个参数量极小的矩阵来加入微调任务,而不微调模型本身。优势是:1. 训练所需显存极小 2. 部署灵活。
Adapter
  • 伴随 PEFT 方法出现的名词。通常情况下,使用 PEFT 方法如 LORA,会训练出一个模型 Adapter,它区分于预训练模型本身,在部署时会作为模型的适配器共同部署,从而改变模型的推理结果。换句话说,PEFT 方法不会训练预训练模型本身,而是训练出一个 Adapter,从而使大模型的部署更加灵活。

关卡任务

1、InternStudio使用

第一步:登录InternStudio首页,首次登录要输入邀请码,填写了上面的邀请链接,会获得一份邀请码,进入首页页面如下:

之后按照相应的文本教程创建开发机,镜像选择cuda12.2,GPU选择10%的A100,点击立即创建。

点击加入开发机:

InternStudio界面的左上角有三个可选项,分别对应的是jupyter notebook,Terminal终端和vscode网页版,各自的界面都与对应应用的界面相似,有过了解的同学,对此应该不会感到陌生。

2、使用Vscode SSH连接远程服务器

接下来介绍使用本地IDE 的 SSH 功能远程连接开发机,这次本地IDE选择VS code

2.1什么是SSH?

SSH 全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。

有两种方式进行远程服务器连接 ,第一种是每次登录都是用密码 ,第二种是配置密钥登录,后续登录无需使用密码,先讲解第一种方式:

2.2.使用密码登录

在开发机界面点击使用SSH登录,将登录命令和密码分别复制到本地电脑的powershell中

输入密码的时候,是隐式输入所以确定粘贴一次就可以,直接回车。

输入nvidia-smi查看GPU的信息,hostname查看开发机名称,使用uname -a查看开发机内核信息,使用lsb_release -a查看开发机版本信息,想要退出远程连接,输入两次exit就可以。

2.3配置SSH密钥进行SSH远程连接

密码连接的方式,需要每次输出密码比较繁琐,可以设置SSH key跳过这步,使用ssh命令中的ssh-kengen命令生成密钥。

ssh-keygen支持RSA和DSA两种认证密钥。

常用参数包括:

  • -t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
  • -b:指定密钥长度。
  • -C:添加注释。
  • -f:指定保存密钥的文件名。
  • -i:读取未加密的ssh-v2兼容的私钥/公钥文件。

使用RSA算法生成密钥,命令为:ssh-keygen -t rsa,一路yes,enter即可,生成的密钥位于C盘~/.ssh/id_rsa.pub位置上。

在powerShell中可以使用**Get-Content** 命令查看生成的密钥,如果是linux操作系统可以使用**cat**命令。也可以通过文本编辑器查看。

回到开发机平台,在首页点击配置SSH Key ,接着点击**添加SSH公钥,**将powershell的密钥复制粘贴上去,名称可以自动生成。

完成SSH Key创建以后,重启终端进行远程连接,就会跳过密码输入这一步了。

2.4使用VScode进行SSH远程连接

这次主要使用VScode,所以使用VScode进行远程连接,VScode进行代码修改等操作时会非常方便。

安装VScode这里就不赘述,CSDN上很多,也很简单。

然后安装插件"SSH",安装完成后,左侧会出现插件的图标,复制之前的SSH登录密码,点击SSH右边的+号,输入连接命令和密码进行连接,右下角会出现连接成功字样,表示连接成功。

然后在右下角弹出来的提示窗口中点击"连接"就可以远程到开发机中了。

3、端口映射

端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。

3.1端口映射作用

后面会进行模型web_demo 的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。

所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。

端口映射的工作原理:

个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。

  • -C:启用压缩,减少传输数据量。
  • -N:不执行远程命令,只建立隧道。
  • -g:允许远程主机连接到本地转发的端口。

当在个人PC上执行这个SSH命令后,SSH客户端会在本地机器的7860端口上监听。

任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。

这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。

3.2端口映射方式

3.2.1 使用 ssh 命令进行端口映射

在开发机界面选择自定义服务

复制下面命令在本地终端运行:

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no
  • -p 37367:是指定 SSH 连接的端口为 37367,这个前面提到过。
  • root@ssh.intern-ai.org.cn:表示要以 root 用户身份连接到 ssh.intern-ai.org.cn 这个主机。
  • -CNg
    • -C 通常用于启用压缩。
    • -N 表示不执行远程命令,仅建立连接用于端口转发等。
    • -g 允许远程主机连接到本地转发的端口。
  • -L {本地机器_PORT}:127.0.0.1:{开发机_PORT}:这是设置本地端口转发,将本地机器的指定端口(由 {本地机器_PORT} 表示)转发到远程主机(这里即 ssh.intern-ai.org.cn)的 127.0.0.1 (即本地回环地址)和指定的开发机端口(由 {开发机_PORT} 表示)。
  • -o StrictHostKeyChecking=no:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。

(这个命令不返回任何的内容,这样代表端口映射在运行了,然后在网页中打开连接就可以看到web ui的界面了)

在开发机的terminal安装好gradio,pip install gradio==4.29.0,在VScode创建一个hello_world.py文件,在文件中填入以下内容,然后运行:

python 复制代码
import socket
import re
import gradio as gr
 
# 获取主机名
def get_hostname():
    hostname = socket.gethostname()
    match = re.search(r'-(\d+)$', hostname)
    name = match.group(1)
    
    return name
 
# 创建 Gradio 界面
with gr.Blocks(gr.themes.Soft()) as demo:
    html_code = f"""
            <p align="center">
            <a href="https://intern-ai.org.cn/home">
                <img src="https://intern-ai.org.cn/assets/headerLogo-4ea34f23.svg" alt="Logo" width="20%" style="border-radius: 5px;">
            </a>
            </p>
            <h1 style="text-align: center;">☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!</h1>
            <h2 style="text-align: center;">😀 Let's go on a journey through ShuSheng Island together.</h2>
            <p align="center">
                <a href="https://github.com/InternLM/Tutorial/blob/camp3">
                    <img src="https://oss.lingkongstudy.com.cn/blog/202406301604074.jpg" alt="Logo" width="20%" style="border-radius: 5px;">
                </a>
            </p>

            """
    gr.Markdown(html_code)

demo.launch()

会弹出的一个网址,点击网址打开网站。

成功

3.2.2 使用 vscode 进行端口映射

运行不同的web ui的话,需要重复输入命令,这样很麻烦,这就需要用到VScode了。前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用"Ctrl+Shift+~"快捷键唤醒终端,在终端的右侧可以找到端口选项:

4、Linux介绍

Linux指令这里也不用赘述,CSDN上可详细查看,另外大佬博客点击

相关推荐
Charary44 分钟前
字符设备驱动开发与杂项开发
linux·驱动开发
梦游钓鱼1 小时前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v1 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
沉默的八哥2 小时前
K8S高可用Web应用部署方案
运维
winyh52 小时前
Vite 打包后Nginx部署配置
运维·nginx
钢板兽2 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
byxdaz2 小时前
NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南
linux·人工智能·深度学习
pyliumy3 小时前
在基于Arm架构的华为鲲鹏服务器上,针对openEuler 20.03 LTS操作系统, 安装Ansible 和MySQL
服务器·架构·ansible
大白的编程日记.3 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习