1. InternStudio开发机介绍
InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持,为开发者提供开箱即用的大语言模型微调环境、工具、数据集,并完美兼容 🤗 HugginFace 开源生态。
1.1 创建开发机
访问连接:http:// https://studio.intern-ai.org.cn/
在这里可以创建开发机,以及修改开发机配置和查看相关日志等。
点击创建开发机,输入名称,选择所需的Cuda版本即可。
进入开发机以后可以看到开发机的主页面,开发机有三种模式可以选择:JupyterLab、终端和VScode,后续用着三种方式均可进行相关操作
2. SSH及端口映射
2.1 什么是SSH?
SSH全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。
SSH 是(C/S架构)由服务器和客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。
后续通过SSH进行远程连接开发机后,即可在本地进行开发。对于一些大模型项目,远程连接服务器是非常有必要的,毕竟本地的电脑很难带动!
2.2 如何使用SSH远程连接开发机?
在vscode上下载SSH的扩展包,输出登录命令和密码即可进行登录,这个比较简单,不再赘述。
由于每次登录时都需要输出密码,后续可以将公钥配置在开发机上,以免每次都输出密码,直接进行SSH连接!
2.3 端口映射
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
那么我们使用开发机为什么要进行端口映射呢?
因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。
所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。
端口映射流程图
2.3.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
:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
首先创建一个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()
在运行代码之前,需要先使用
pip install gradio==4.29.0
命令安装以下依赖包,然后在Web IDE的终端中运行了一个hello_world.py
出现上述结果即代表运行成功
如果不进行端口映射的话,使用本地IP是访问不了的,具体如下:
使用下面的命令,将它输入到powerShell中:
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
出现上述即代表成功!
2.3.2 使用vscode进行端口映射
用vscode连接开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:
在这里可以查看端口映射的信息,如果需要修改端口的话,可以在端口那一栏修改端口号。
3. Linux 基础命令
3.1 文件管理
在 Linux 中,常见的文件管理操作包括:
- 创建文件:可以使用
touch
命令创建空文件。 - 创建目录:使用
mkdir
命令。 - 目录切换:使用
cd
命令。 - 显示所在目录:使用
pwd
命令。 - 查看文件内容:如使用
cat
直接显示文件全部内容,more
和less
可以分页查看。 - 编辑文件:如
vi
或vim
等编辑器。 - 复制文件:用
cp
命令。 - 创建文件链接:用
ln
命令。 - 移动文件:通过
mv
命令。 - 删除文件:使用
rm
命令。 - 删除目录:
rmdir
(只能删除空目录)或rm -r
(可删除非空目录)。 - 查找文件:可以用
find
命令。 - 查看文件或目录的详细信息:使用
ls
命令,如使用ls -l
查看目录下文件的详细信息。 - 处理文件:进行复杂的文件操作,可以使用
sed
命令。
3.1.1 touch
用来快速创建文件,例如我们要创建一个demo.py
文件:
3.1.2 cat
cat
命令可以查看文件里面的内容,更多的使用命令可以使用--help
命令查看:
- -a,--show-all等价于-vET
- -b,--number-non空白数非空输出行,覆盖-n
- -e, 等价于-vE
- -E,--show-结束显示$在每一行的末尾
- -n,--number编号所有输出行
- -s,--crick-空白抑制重复的空输出行
- -t等价于-vT
- -t,--show-tabs将制表符显示为^I
- -v,--show非打印使用^和M-表示法,LFD和TAB除外
3.1.3 vi/vim
我们需要编辑文件的时候可以使用vi
或者vim
命令,当你进入文件编辑以后,有三种模式:
进入编辑模式可以使用i
,vim的方便之处就是可以在终端进行简单的文件修改。
3.1.4 cp 和 ln(重点)
**cp
**命令在后面课程中会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:
- 复制文件:
cp 源文件 目标文件
- 复制目录:
cp -r 源目录 目标目录
但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln
命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
所以我们一般使用软连接,它的常用的使用方法如下:
ln [参数][源文件或目录][目标文件或目录]
参数如下:
- -s:创建软链接(符号链接)也是最常用的;
- -f:强制执行,覆盖已存在的目标文件;
- -i:交互模式,文件存在则提示用户是否覆盖;
- -n:把符号链接视为一般目录;
- -v:显示详细的处理过程。
3.1.5 mv 和 rm
mv
命令和rm
命令的使用方式很相似,但是mv
是用来移动文件或者目录的,同时还可以进行重命名。rm
命令则是用来删除文件或者目录的。
常用的使用方法如下:
- mv 命令:
常用参数:
-i
:交互模式,覆盖前询问。-f
:强制覆盖。-u
:只在源文件比目标文件新时才进行移动。
使用示例:
-
mv file1.txt dir1/
将文件
file1.txt
移动到目录dir1
中。 -
mv file1.txt file2.txt
将文件
file1.txt
重命名为file2.txt
。 -
rm 命令:
常用参数:
-i
:交互模式,删除前询问。-f
:强制删除,忽略不存在的文件,不提示确认。-r
:递归删除目录及其内容。
使用示例:
rm file.txt
:删除文件file.txt
。rm -r dir1/
:递归删除目录dir1
及其所有内容。
删除目录的命令也可以使用rmdir
。
3.1.6 find
find
命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目录及其子目录中查找符合条件的文件或目录,并执行相应的操作。
以下是find
命令的一些常见用法:
- 按文件名查找:使用
-name
选项按照文件名查找文件。例如,find /path/to/directory -name
"file.txt"
将在指定目录及其子目录中查找名为file.txt
的文件。 - 按文件类型查找:使用
-type
选项按照文件类型查找文件。例如,find /path/to/directory -type f
将查找指定目录及其子目录中的所有普通文件。 - 按文件大小查找:使用
-size
选项按照文件大小查找文件。例如,find /path/to/directory -size +100M
将查找指定目录及其子目录中大于100MB的文件。 - 按修改时间查找:使用
-mtime
、-atime
或-ctime
选项按照文件的修改时间、访问时间或状态更改时间查找文件。例如,find /path/to/directory -mtime -7
将查找指定目录及其子目录中在7天内修改过的文件。 - 按文件权限查找:使用
-perm
选项按照文件权限查找文件。例如,find /path/to/directory -perm 755
将查找指定目录及其子目录中权限为755的文件。 - 按用户或组查找:使用
-user
或-group
选项按照文件的所有者或所属组查找文件。例如,find /path/to/directory -user username
将查找指定目录及其子目录中属于用户username
的文件。 - 执行操作:使用
-exec
选项可以对找到的文件执行相应的操作。例如,find /path/to/directory -name "*.txt" -exec rm {} \;
将删除找到的所有以.txt
结尾的文件。
3.1.7 ls
ls
命令可以用来列出目录的内容以及详细信息。
常用参数及使用方法如下:
-a
:显示所有文件和目录,包括隐藏文件(以.
开头的文件或目录)。-l
:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。-h
:与-l
结合使用,以人类可读的方式显示文件大小(如K
、M
、G
等)。-R
:递归列出子目录的内容。-t
:按文件修改时间排序显示。
3.1.8 sed
sed
命令是一种流编辑器,主要用于文本处理,在处理复杂的文件操作时经常用到,在后续的课程中会使用到,sed
命令常用参数及使用示例如下:
- 参数说明:
-e<script>
或--expression=<script>
:直接在命令行中指定脚本进行文本处理。-f<script文件>
或--file=<script文件>
:从指定的脚本文件中读取脚本进行文本处理。-n
或--quiet
或--silent
:仅打印经过脚本处理后的输出结果,不打印未匹配的行。
- 动作说明:
a
:在当前行的下一行添加指定的文本字符串。c
:用指定的文本字符串替换指定范围内的行。d
:删除指定的行。i
:在当前行的上一行添加指定的文本字符串。p
:打印经过选择的行。通常与-n
参数一起使用,只打印匹配的行。s
:使用正则表达式进行文本替换。例如,s/old/new/g
将所有 "InternLM" 替换为 "InternLM yyds"。
- 示例:
在示例中使用了echo
命令,这和python中的print
一样,用来打印内容,这里使用管道符>
将InternLM打印到file文件中,常用的管道符还有<
和|
,比如我们可以使用grep
命令来查看python中安装的包含os
字段的包:
grep
是一个强大的文本搜索工具。常用参数如下:
-i
:忽略大小写进行搜索。-v
:反转匹配,即显示不匹配的行。-n
:显示行号。-c
:统计匹配的行数。
3.2 进程管理
进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:
- ps:查看正在运行的进程
- top:动态显示正在运行的进程
- pstree:树状查看正在运行的进程
- pgrep:用于查找进程
- nice:更改进程的优先级
- jobs:显示进程的相关信息
- bg 和 fg:将进程调入后台
- kill:杀死进程
在开发机中还有一条特殊的命令nvidia-smi
,它是 NVIDIA 系统管理接口(NVIDIA System Management Interface)的命令行工具,用于监控和管理 NVIDIA GPU 设备。它提供了一种快速查看 GPU 状态、使用情况、温度、内存使用情况、电源使用情况以及运行在 GPU 上的进程等信息的方法。
下面是关于各个命令使用示例:
ps
:列出当前系统中的进程。使用不同的选项可以显示不同的进程信息,例如:-
ps aux # 显示系统所有进程的详细信息
-
top
:动态显示系统中进程的状态。它会实时更新进程列表,显示CPU和内存使用率最高的进程。-
top # 启动top命令,动态显示进程信息
-
pstree
:以树状图的形式显示当前运行的进程及其父子关系。-
pstree # 显示进程树
-
pgrep
:查找匹配条件的进程。可以根据进程名、用户等条件查找进程。-
pgrep -u username # 查找特定用户的所有进程
-
nice
:更改进程的优先级。nice
值越低,进程优先级越高。-
nice -n 10 long-running-command # 以较低优先级运行一个长时间运行的命令
-
jobs
:显示当前终端会话中的作业列表,包括后台运行的进程。-
jobs # 列出当前会话的后台作业
-
bg
和fg
:bg
将挂起的进程放到后台运行,fg
将后台进程调回前台运行。-
bg # 将最近一个挂起的作业放到后台运行 fg # 将后台作业调到前台运行
-
kill
:发送信号到指定的进程,通常用于杀死进程。-
kill PID # 杀死指定的进程ID
-
注意,
kill
命令默认发送SIGTERM
信号,如果进程没有响应,可以使用-9
使用SIGKILL
信号强制杀死进程: -
kill -9 PID # 强制杀死进程
-
SIGTERM
(Signal Termination)信号是Unix和类Unix操作系统中用于请求进程终止的标准信号。当系统或用户想要优雅地关闭一个进程时,通常会发送这个信号。与SIGKILL
信号不同,SIGTERM
信号可以被进程捕获并处理,从而允许进程在退出前进行清理工作。
以下是 nvidia-smi
命令的一些基本命令用法:
- 显示 GPU 状态的摘要信息:
-
nvidia-smi
-
- 显示详细的 GPU 状态信息:
-
nvidia-smi -l 1
-
这个命令会每1秒更新一次状态信息。
-
- 显示 GPU 的帮助信息:
-
nvidia-smi -h
-
- 列出所有 GPU 并显示它们的 PID 和进程名称:
-
nvidia-smi pmon
-
- 强制结束指定的 GPU 进程:
-
nvidia-smi --id=0 --ex_pid=12345
-
这会强制结束 GPU ID 为 0 上的 PID 为 12345 的进程。
-
- 设置 GPU 性能模式:
-
nvidia-smi -pm 1 nvidia-smi -i 0 -pm 1
-
第一个命令会为所有 GPU 设置为性能模式,第二个命令只针对 ID 为 0 的 GPU。
-
- 重启 GPU:
-
nvidia-smi --id=0 -r
-
这会重启 ID 为 0 的 GPU。
-
下面通过一张图片对GPU信息进行介绍:
3.3 工具使用
这里介绍一个工具TMUX
,TMUX
是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。为什么要介绍这个工具呢?因为在后面进行Xtuner
微调模型的时候,时间会很长,使用Tmux
可以解决程序被杀死中断的情况,下面介绍一下如何安装并使用。
因为开发机使用的是ubuntu的操作系统,可以使用lsb_release -a
命令查看ubuntu的系统信息:
然后使用apt install tmux
命令安装tmux,安装完成以后可以使用tmux
命令就可以使用tmux了,如果想退出tmux可以使用“Ctrl+d”快捷键。
开发机仅 /root 路径下的文件是持久化存储的,其他路径下安装的软件重启后都会被重置。
具体的使用方法可以查看: