所有tag为书生大模型的文档,连同本文档在内,为书生大模型实战营训练内容,文档中的内容并不局限于实战营本身,但算力平台均首选上海AI实验室开发的云端集成开发环境InternStudio开发手册InternStudio算力平台的相关内容可以点击链接跳转。

1.SSH与远程联机

1.1 SSH是什么?

在通过算力平台成功创建开发机后,可以通过SSH远程连接开发机平台。

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

SSH 是(C/S架构)由服务器和客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。通过SSH可以实现远程连接进行开发。

远程连接的好处就是,如果你使用的是远程办公,你可以通过SSH远程连接开发机,这样就可以在本地进行开发。而且如果你需要跑一些本地的代码,又没有环境,那么远程连接就非常有必要了。

1.2 使用SSH远程连接开发机

InternStudio算力平台为例,可以进入开发机平台,进入开发机页面找到创建的开发机,点击SSH连接,获取登录命令和密码(当下任何主流算力平台都有相应的SSH连接配置入口,此处不再赘述)。

image
image

当完成开发机的创建以后,需要打开powerShell终端,复制登录命令和终端进行远程连接。

在使用PowerShell启动SSH时,可能会出现以下情况:

image
image

可以尝试使用CMD的SSH命令,如果CMD可以启动SSH,则代表可能缺少了SSH的服务器端安装,可以去SSH官网下载完整的OpenSSH工具。安装完毕后就可以在PowerShell里调用SSH了:

image
image

复制粘贴登录命令和密码,看到以下界面,则代表SSH连接成功。

image
image

此处注意,powershell使用鼠标右键进行粘贴;在输入密码时,右键粘贴密码后并不会明文显示,可以直接回车运行。

连接上开发机以后,可以利用Linux命令查看系统信息。

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

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

每次远程连接都需要输入密码,这对于一个程序员来说非常的不帅。因此需要设置SSH Key来跳过输入密码这一步,采用ssh-keygen命令生成密钥(在使用InternStudio算力平台时,如果电脑用户名包含中文字符则会无法识别,需要手动修改电脑用户名,可以采用纯英文的电脑用户名,例如Artemis👇)

image
image

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

常用参数包括:

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

使用RAS算法生成密钥,命令为:

ssh-keygen -t rsa

随后可以用Get-Content命令来查看生成的密钥

image
image

回到算力开发平台,添加公钥:

image
image

在PowerShell中再次输入登录命令,这一次不需要再输入密码了。

image
image

1.4 使用VScode进行SSH远程连接

首先去VScode里安装SSH插件。

image
image

进入SSH插件进行连接。

image
image
image
image

在选择config文件时可以直接用默认也可以采用自定义的方式,此处直接使用默认。

输入算力平台SSH连接的密码。

image
image

点击“打开文件夹”,已经能看到工作目录了👇。

image
image

选取/root作为工作目录后,下一次登录就不需要再输入登陆命令的信息了(但还是要输入密码)。

1.5 端口映射

端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。根据开发手册,后续的内容可能需要进行web_demo的部署,为避免遇到ui加载不全的问题,需要将外网链接映射到本地主机来访问。

以下是一个简单的端口映射命令,在主机上运行该命令即可进行端口映射:

ssh -p 37436 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no

在这条命令中:

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

端口映射的相关知识在后续会有应用。

2.Linux基础命令

在成功部署和远程连接开发机后,就能够在本地机器运行开发机的Linux环境了。由于使用开发机时很少使用到权限管理,因此本文中不在此处多做相关表述。

2.1 文件管理

在 Linux 中,常见的文件管理操作包括:

  • 创建文件:可以使用 touch 命令创建空文件。
  • 创建目录:使用 mkdir 命令。
  • 目录切换:使用cd命令。
  • 显示所在目录:使用pwd命令。
  • 查看文件内容:如使用 cat 直接显示文件全部内容,more 和 less 可以分页查看。
  • 编辑文件:如 vi 或 vim 等编辑器。
  • 复制文件:用 cp 命令。
  • 创建文件链接:用ln命令。
  • 移动文件:通过 mv 命令。
  • 删除文件:使用 rm 命令。
  • 删除目录rmdir(只能删除空目录)或 rm -r(可删除非空目录)。
  • 查找文件:可以用 find 命令。
  • 查看文件或目录的详细信息:使用ls命令,如使用 ls -l查看目录下文件的详细信息。
  • 处理文件:进行复杂的文件操作,可以使用sed命令。

2.2 一些简单的命令运用

各类文件管理的命令实际并不复杂,需要的只是熟练度的提高。

2.2.1 文件创建与查看

例如使用touch快速的创建一个demo.txt文件:

image
image

使用mkdir创建一个名为test的目录:

image
image

我们已经可以在目录下看到刚刚新建的文件和文件夹了:

image
image

要在文件夹之间移动可以使用cd命令,然后利用pwd命令来查看当前所在的文件夹:

image
image

要想查看文件里面的内容,则可以使用cat,常用命令包括:

  • A, --show-all:等价于 vET
  • b, --number-nonblank:为非空输出行编号,覆盖 n
  • e:等价于 vE
  • E, --show-ends:在每行的末尾显示 $
  • n, --number:为所有输出行编号
  • s, --squeeze-blank:压缩连续的空行
  • t:等价于 vT
  • T, --show-tabs:将 TAB 字符显示为 ^I
  • v, --show-nonprinting:使用 ^M- 表示法显示不可打印字符,LFD(换行符)和 TAB 除外

2.2.2 文件直接编辑

linux操作系统中/表示根目录,根目录下有许多系统所需的目录和文件,刚才创建的test目录就存在与root目录下,其中.表示的是当前目录,..表示的上级目录。

当需要编辑文件的时候可以使用vi或者vim命令,当进入文件编辑以后,有三种模式:

  • 命令模式:键入的所有内容会被视为命令。
  • 编辑模式:也叫插入模式,编辑文档内容。
  • 末行模式:用来执行待定命令,例如文件保存、退出或者设置编辑环境。

在需要编辑文件时可以使用iao等命令,在终端就可以进行简单的文件修改。

编辑模式中的常见命令:

  • dd:删除一行
  • yy:复制一行
  • p:粘贴
  • gg:到行首
  • G:到行尾
  • ZZ:保存退出

末行模式中的常见命令:

  • :wq:保存退出
  • :q!:不保存退出
  • :w:保存
  • /:查找

2.2.3 文件管理

想要复制一个文件或者文件目录,常用cp这个命令:

  • 复制文件:cp 源文件 目标文件
  • 复制目录:cp -r 源目录 目标目录

但是如果是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln命令,这个就和windows的快捷方式一样。

Linux中链接分为两种:硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置;硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

所以我们一般使用软连接,它的常用的使用方法如下:

  • ln [参数][源文件或目录][目标文件或目录]

参数如下:

  • s:创建软链接(符号链接)也是最常用的;
  • f:强制执行,覆盖已存在的目标文件;
  • i:交互模式,文件存在则提示用户是否覆盖;
  • n:把符号链接视为一般目录;
  • v:显示详细的处理过程。

如果不是想要复制文件或文件目录,而只是单纯想要移动,则可以使用mv命令。这个命令还可以用来重命名:

  • mv file1.txt dir1/:将文件 file1.txt 移动到目录 dir1 中。
  • mv file1.txt file2.txt:将文件 file1.txt 重命名为 file2.txt

常用参数:

  • i:交互模式,覆盖前询问。
  • f:强制覆盖。
  • u:只在源文件比目标文件新时才进行移动。

此外,rm命令则用于文件删除或者目录删除,使用方式和mv命令比较相似:

  • rm file.txt:删除文件 file.txt
  • rm -r dir1/:递归删除目录 dir1 及其所有内容。

常用参数:

  • i:交互模式,删除前询问。
  • f:强制删除,忽略不存在的文件,不提示确认。
  • r:递归删除目录及其内容。

删除目录的命令也可以使用rmdir

2.2.4 文件查找与展示

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的文件。
  • 按修改时间查找:使用mtimeatimectime选项按照文件的修改时间、访问时间或状态更改时间查找文件。例如,find /path/to/directory -mtime -7将查找指定目录及其子目录中在7天内修改过的文件。
  • 按文件权限查找:使用perm选项按照文件权限查找文件。例如,find /path/to/directory -perm 755将查找指定目录及其子目录中权限为755的文件。
  • 按用户或组查找:使用usergroup选项按照文件的所有者或所属组查找文件。例如,find /path/to/directory -user username将查找指定目录及其子目录中属于用户username的文件。
  • 执行操作:使用exec选项可以对找到的文件执行相应的操作。例如,find /path/to/directory -name "*.txt" -exec rm {} \;将删除找到的所有以.txt结尾的文件。

ls命令可以用来列出目录的内容以及详细信息

常用参数及使用方法如下:

  • a:显示所有文件和目录,包括隐藏文件(以.开头的文件或目录)。
  • l:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。
  • h:与l结合使用,以人类可读的方式显示文件大小(如KMG等)。
  • R:递归列出子目录的内容。
  • t:按文件修改时间排序显示。
image
image

2.2.5 复杂文本处理

sed命令是一种流编辑器,主要用于文本处理,在处理复杂的文件操作时经常用到:

  • 参数说明:
    • e<script> 或 -expression=<script>:直接在命令行中指定脚本进行文本处理。
    • f<script文件> 或 -file=<script文件>:从指定的脚本文件中读取脚本进行文本处理。
    • n 或 -quiet 或 -silent:仅打印经过脚本处理后的输出结果,不打印未匹配的行。
  • 动作说明:
    • a:在当前行的下一行添加指定的文本字符串。
    • c:用指定的文本字符串替换指定范围内的行。
    • d:删除指定的行。
    • i:在当前行的上一行添加指定的文本字符串。
    • p:打印经过选择的行。通常与 n 参数一起使用,只打印匹配的行。
    • s:使用正则表达式进行文本替换。例如,s/old/new/g 将所有 "Artemis" 替换为 "ArtemisYi"。
image
image

以上案例中使用的echo命令与python中的print一样用于打印内容,并用管道符>将“Artemis”直接打印到demo.txt中。常用的管道符还有<|,比如我们可以使用grep命令来查看python中安装的包含os字段的包:

image
image

grep是一个强大的文本搜索工具。常用参数如下:

  • i:忽略大小写进行搜索。
  • v:反转匹配,即显示不匹配的行。
  • n:显示行号。
  • c:统计匹配的行数。

2.3 进程管理

进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:

  • 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 和 fgbg 将挂起的进程放到后台运行,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。

通过nvidia-smi可以得到关于GPU的相关信息:

image
image

2.4 其他工具

这里介绍一个工具TMUXTMUX 是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。因为开发机使用的是ubuntu的操作系统,可以使用lsb_release -a 命令查看ubuntu的系统信息:

image
image

然后使用apt install tmux命令安装tmux,安装完成以后可以使用tmux命令就可以使用tmux了,如果想退出tmux可以使用“Ctrl+d”快捷键。具体的使用方法可以参考这里

3.Conda

Conda是一个开源的包管理和环境管理系统,可在 Windows、macOS 和 Linux 上运行。它快速安装、运行和更新软件包及其依赖项。使用 Conda,就可以轻松在本地计算机上创建、保存、加载和切换不同的环境。

一般主流的开发机中已经预先安装了conda可以直接使用。如果没有安装则可以参考这里

3.1 设置

可以使用conda --version来查看当前开发机中conda的版本信息:

image
image

如果在使用conda安装包的时候比较慢,可以设置国内镜像来提升安装速度:

#设置清华镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2

3.2 环境管理

可以使用conda create -n Artemis python=3.10创建虚拟环境,这里表示创建了python版本为3.10、名字为name的虚拟环境。创建后,可以在.conda目录下的envs目录下找到。

image
image

想要查看有哪些虚拟环境可以使用下面的命令:

conda env list
conda info -e
conda info --envs

同时还可以看到环境所在的目录。

image
image

如果想要删除某个虚拟环境可以使用

conda remove --name name --all

如果只删除虚拟环境中的某个或者某些包可以使用

conda remove --name name  package_name

导出虚拟环境对于特定的环境是非常有必要的,因为有些软件包的依赖关系很复杂,如果自己重新进行创建和配置的话很麻烦,如果我们将配置好的环境导出,这样下次使用还原就行了,而且也可以把配置分享给其他人。

#获得环境中的所有配置
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f  myenv.yml

3.3 condapip

condapip的一些区别:

  • conda可以管理非python包,pip只能管理python包。
  • conda可以用来创建虚拟环境,pip不能,需要依赖virtualenv之类的包。
  • conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
  • conda安装的包会统一下载到当前虚拟环境对应的目录下,下载一次多次安装。pip是直接下载到对应环境中。

Wheel是一种Python安装包的格式。

它是一种预编译的二进制分发格式,类似于conda中的已编译二进制文件。

Wheel格式的主要优点包括:

  • 安装速度快:因为已经进行了预编译,所以在安装时不需要像源码安装那样进行编译过程,节省了时间。
  • 一致性:确保在不同的系统和环境中安装的结果是一致的。

例如,如果要安装一个大型的Python库,使用Wheel格式可以避免在不同的机器上因为编译环境的差异而导致的安装问题。而且,对于那些没有编译环境或者编译能力较弱的系统,Wheel格式能够让安装过程更加顺畅。