参加书生.浦江大模型实战训练营,学习大模型知识和微调技术,所有课程免费,通过闯关的形式学习,也比较有趣。一起来了解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文件,在文件中填入以下内容,然后运行:
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上可详细查看,另外大佬博客点击。