一、准备工作:
1.创建好GitHub用户,网址如下:
2.在InternStudio算力平台中创建开发机,网址如下:
https://studio.intern-ai.org.cn
(1)先点击首页,然后点击创建开发机,进入创建开发机页面
(2)依次填写开发机名称,镜像版本和资源配置,然后点击立即创建
(3)在左侧开发机选项中,即可看到创建的开发机基础信息
二、SSH及端口映射
1.启动开发机
2.点击ssh连接查看当前开发机的ssh密码,每台开发机的密码有不一样,注意复制自己开发机的密码进行连接
3.打开个人电脑的powershell终端,复制输入登录命令,然后终端会提示输入密码,复制密码敲击回车,这里需注意密码不会以密文的形式显示出来,切勿重复粘贴!!
4.若终端提示,Permission denied, please try again,表示密码错误;
若出现下述内容表示登录成功。
5.配置ssh秘钥实现免密登录
(1)终端输入ssh-keygen -t rsa,创建ssh秘钥,一路按回车即可
(2)注意观察ssh生成路径,如果是/root开头则表示存储在linux系统中,如果是C:/Users开头则表示存储在Windows系统中,Linux使用cat+路径查看ssh秘钥,Windows使用Get-Content+路径查看。(Windows系统必须在本地生成ssh后续才能免密登录,本地生成操作为:打开powershell终端 -> 直接输入ssh-keygen -t rsa命令即可)![](https://i-blog.csdnimg.cn/direct/2ec0246c82b14047934c5880368187ad.png)
(3)回到开发机页面,点击添加公钥
(4)把终端里输出的ssh秘钥复制到公钥文本框中,点击立即添加
6.使用vs连接
(1)下载SSH连接插件
(2)添加ssh连接
(3)复制登录命令
(4)粘贴到(2)图中的输入框中回车,右下角出现添加主机提示即可
(5)远程连接完成后,点击打开文件夹,进入工作目录
7.端口映射
(1)点击自定义服务
(2)复制映射命令,默认将7860端口作为映射端口
(3)创建hello_world.py文件,运行一个web demo代码
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()
(4)在powershell终端中运行命令启动端口映射
ssh -p 48979 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
成功运行后终端内容如下:
(5)运行代码后在浏览器中访问7860端口
三、Linux基础命令
1.文件操作命令
- 创建文件:可以使用
touch
命令创建空文件。 - 创建目录:使用
mkdir
命令。 - 目录切换:使用
cd
命令。 - 显示所在目录:使用
pwd
命令。 - 查看文件内容:如使用
cat
直接显示文件全部内容,more
和less
可以分页查看。 - 编辑文件:如
vi
或vim
等编辑器。 - 复制文件:用
cp
命令。 - 创建文件链接:用
ln
命令。 - 移动文件:通过
mv
命令。 - 删除文件:使用
rm
命令。 - 删除目录:
rmdir
(只能删除空目录)或rm -r
(可删除非空目录)。 - 查找文件:可以用
find
命令。 - 查看文件或目录的详细信息:使用
ls
命令,如使用ls -l
查看目录下文件的详细信息。 - 处理文件:进行复杂的文件操作,可以使用
sed
命令。
(1)touch+文件名,创建文件
(2)mkdir+目录名,创建目录
(3)cd,切换目录命令,.表示当前目录,..表示上级目录,~表示root的home目录,/表示根目录
(4)pwd命令,查看当前所在目录
(5)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除外
(6)vi和vim命令,编辑文件
(7)cp和ln
**cp
**命令在后面课程中会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:
- 复制文件:
cp 源文件 目标文件
- 复制目录:
cp -r 源目录 目标目录
但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln
命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
所以我们一般使用软连接,它的常用的使用方法如下:
ln [参数][源文件或目录][目标文件或目录]
参数如下:
- -s:创建软链接(符号链接)也是最常用的;
- -f:强制执行,覆盖已存在的目标文件;
- -i:交互模式,文件存在则提示用户是否覆盖;
- -n:把符号链接视为一般目录;
- -v:显示详细的处理过程。
(8)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
。
(9)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
结尾的文件。
(10)ls
ls
命令可以用来列出目录的内容以及详细信息。
常用参数及使用方法如下:
-a
:显示所有文件和目录,包括隐藏文件(以.
开头的文件或目录)。-l
:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。-h
:与-l
结合使用,以人类可读的方式显示文件大小(如K
、M
、G
等)。-R
:递归列出子目录的内容。-t
:按文件修改时间排序显示
(11)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
:统计匹配的行数。
2.进程管理命令
进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:
- ps:查看正在运行的进程
- top:动态显示正在运行的进程
- pstree:树状查看正在运行的进程
- pgrep:用于查找进程
- nice:更改进程的优先级
- jobs:显示进程的相关信息
- bg 和 fg:将进程调入后台
- kill:杀死进程
(1)ps:列出当前系统中的进程。使用不同的选项可以显示不同的进程信息,例如:
ps aux # 显示系统所有进程的详细信息
(2)top
:动态显示系统中进程的状态。它会实时更新进程列表,显示CPU和内存使用率最高的进程
top # 启动top命令,动态显示进程信息
(3)pstree
:以树状图的形式显示当前运行的进程及其父子关系。
pstree # 显示进程树
如果出现下图提示(pstree未知命令):
则需要先运行以下命令安装pstree,没有就不管
apt-get install psmisc
然后在运行pstree命令
(4)pgrep
:查找匹配条件的进程。可以根据进程名、用户等条件查找进程。
pgrep -u username # 查找特定用户的所有进程
(5)nice
:更改进程的优先级。nice
值越低,进程优先级越高。
nice -n 10 long-running-command # 以较低优先级运行一个长时间运行的命令
(6)jobs
:显示当前终端会话中的作业列表,包括后台运行的进程。
(7)bg
和 fg
:bg
将挂起的进程放到后台运行,fg
将后台进程调回前台运行。
bg # 将最近一个挂起的作业放到后台运行
fg # 将后台作业调到前台运行
(8)kill
:发送信号到指定的进程,通常用于杀死进程。
kill PID # 杀死指定的进程ID
-
注意,
kill
命令默认发送SIGTERM
信号,如果进程没有响应,可以使用-9
使用SIGKILL
信号强制杀死进程:
kill -9 PID # 强制杀死进程
SIGTERM
(Signal Termination)信号是Unix和类Unix操作系统中用于请求进程终止的标准信号。当系统或用户想要优雅地关闭一个进程时,通常会发送这个信号。与SIGKILL
信号不同,SIGTERM
信号可以被进程捕获并处理,从而允许进程在退出前进行清理工作。(来源于网络)
(9)以下是 nvidia-smi
命令的一些基本命令用法:
显示 GPU 状态的摘要信息:nvidia-smi
显示详细的 GPU 状态信息:nvidia-smi -l 1,1表示更新间隔时间为1s
显示 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 -h
下面通过一张图片对GPU信息进行介绍:
3.工具使用
这里介绍一个工具TMUX
,TMUX
是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。为什么要介绍这个工具呢?因为在后面进行Xtuner
微调模型的时候,时间会很长,使用Tmux
可以解决程序被杀死中断的情况,下面介绍一下如何安装并使用。
因为开发机使用的是ubuntu的操作系统,可以使用lsb_release -a
命令查看ubuntu的系统信息:
然后使用apt install tmux
命令安装tmux,安装完成以后可以使用tmux
命令就可以使用tmux了,如果想退出tmux可以使用“Ctrl+d”快捷键。
开发机仅 /root 路径下的文件是持久化存储的,其他路径下安装的软件重启后都会被重置。
具体的使用方法可以查看:
四、Conda和Shell介绍
Conda 是一个开源的包管理和环境管理系统,可在 Windows、macOS 和 Linux 上运行。它快速安装、运行和更新软件包及其依赖项。使用 Conda,您可以轻松在本地计算机上创建、保存、加载和切换不同的环境。
在开发机中已经安装了conda
,我们可以直接使用,而且开发机中也有内置的conda
命令studio-conda
,下面我们会介绍conda
的基本使用,还有studio-conda
的使用方法以及介绍一下studio-conda
是怎么实现的。
我们会从下面几部分进行介绍:
- conda设置
- conda环境管理
- conda和pip
- studio-conda使用与Shell(扩展)
1.conda设置
使用conda --version
来查看当前开发机中conda
的版本信息:
当我们要使用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
但是我们一般都是使用pip
进行包的安装的,后面我们会介绍pip
和conda
的区别。
如果我们想要查看conda的配置信息可以使用conda config --show
命令,如果是开发机默认的设置的话会返回:(一部分信息)
这些配置在Conda
环境配置中,会影响软件包的安装、更新、环境管理等操作的方式和结果。
2.conda环境管理
这一部分是conda
中非常重要的一部分,掌握了这一部分大家就可以将开发环境玩转到飞起了😀。
(1)创建虚拟环境
我们可以使用conda create -n name python``=3.10
创建虚拟环境,这里表示创建了python版本为3.10、名字为name的虚拟环境。创建后,可以在.conda
目录下的envs
目录下找到。
在不指定python版本时,会自动创建基于最新python版本的虚拟环境。同时我们可以在创建虚拟环境的同时安装必要的包:conda create -n name numpy matplotlib python=3.10
(但是不建议大家这样用)
创建虚拟环境的常用参数如下:
- -n 或 --name:指定要创建的环境名称。
- -c 或 --channel:指定额外的软件包通道。
- --clone:从现有的环境克隆来创建新环境。
- -p 或 --prefix:指定环境的安装路径(非默认位置)。
(2)查看有哪些虚拟环境
如果想要查看有哪些虚拟环境我们可以使用下面的命令:
conda env list conda info -e conda info --envs
(3)激活与退出虚拟环境
当我们创建完虚拟环境后我们可以使用conda activate name
命令来激活虚拟环境,如何查看是否切换成功呢?很简单,只需要看(base)
是否变成了创建的虚拟环境的名称。
如果想要退出虚拟环境的话可以使用:
conda activate
conda deactivate
这两条命令都会回到base
环境,因为base
是conda的基础环境,如果仔细观察的话,base
环境目录比其他的虚拟环境目录层级要高。
(4)删除与导出虚拟环境
如果想要删除某个虚拟环境可以使用conda remove --name name --all
,如果只删除虚拟环境中的某个或者某些包可以使用conda remove --name name package_name
导出虚拟环境对于特定的环境是非常有必要的,因为有些软件包的依赖关系很复杂,如果自己重新进行创建和配置的话很麻烦,如果我们将配置好的环境导出,这样下次使用还原就行了,而且也可以把配置分享给其他人。
#获得环境中的所有配置
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f myenv.yml
比如我们将name虚拟环境导出,配置信息是这样的:
比如我们将name
虚拟环境导出,配置信息是这样的:
3.conda和pip
这部分我们介绍一些conda
和pip
的一些区别:
- conda可以管理非python包,pip只能管理python包。
- conda可以用来创建虚拟环境,pip不能,需要依赖virtualenv之类的包。
- conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
- conda安装的包会统一下载到当前虚拟环境对应的目录下,下载一次多次安装。pip是直接下载到对应环境中。
Wheel 是一种 Python 安装包的格式。
它是一种预编译的二进制分发格式,类似于 conda 中的已编译二进制文件。
Wheel 格式的主要优点包括:
- 安装速度快:因为已经进行了预编译,所以在安装时不需要像源码安装那样进行编译过程,节省了时间。
- 一致性:确保在不同的系统和环境中安装的结果是一致的。
例如,如果您要安装一个大型的 Python 库,使用 Wheel 格式可以避免在不同的机器上因为编译环境的差异而导致的安装问题。而且,对于那些没有编译环境或者编译能力较弱的系统,Wheel 格式能够让安装过程更加顺畅。
4.studio-conda使用与Shell
在导出环境文件目录下创建test.sh脚本文件
#!/bin/bash
# 定义导出环境的函数
export_env() {
local env_name=$1
echo "正在导出环境: $env_name"
# 导出环境到当前目录下的env_name.yml文件
conda env export -n "$env_name" > "$env_name.yml"
echo "环境导出完成。"
}
# 定义还原环境的函数
restore_env() {
local env_name=$1
echo "正在还原环境: $env_name"
# 从当前目录下的env_name.yml文件还原环境
conda env create -n "$env_name" -f "$env_name.yml"
echo "环境还原完成。"
}
# 检查是否有足够的参数
if [ $# -ne 2 ]; then
echo "使用方法: $0 <操作> <环境名>"
echo "操作可以是 'export' 或 'restore'"
exit 1
fi
# 根据参数执行操作
case "$1" in
export)
export_env "$2"
;;
restore)
restore_env "$2"
;;
*)
echo "未知操作: $1"
exit 1
;;
esac
当我们完成Shell脚本的创建以后我们需要为脚本赋予权限,可以使用命令:chmod +x test.sh
,然后输入./test.sh restore name.yml
并按下回车就可以还原虚拟环境了。