系列文章目录
入门岛之一,Linux基础知识
前言
2024.7.10日开始,我参加了由上海人工智能创新中心举行的,第三期书生大模型实战营,本文为学习过程的记录。如有理解错误的地方,欢迎指正。
一、InternStudio开发机
InternStudio是上海人工智能创新中心提供的在线的云端算力平台,地址是:https://studio.intern-ai.org.cn/,在完成本节的打卡前,需要创建一个开发机。
注册登录后,点击页面上的创建开发机,镜像选择cuda12.2-conda GPU选最低的10%(10%也会扣算力,要是有0%的GPU就好了,这几节都用不到显卡),其它配置自行配置或者默认即可,点击 立即创建 等一会就可以在开发机列表中看到创建好的开发机了。注意开发机不用的话一定要关闭,默认开了8个小时,如果没有用完关机,还会退给你算力点
二、SSH及端口映射
1. SSH
ssh的全名是Secure Shell,是一种网络安全协议,通过加密和认证机制来实现安全的访问和文件传输等功能。
SSH由服务端和客户端组成(是C/S架构)。通过TCP连接来创建SSH通道,先通过一些算法生成一个会话密钥(对称的),然后通过会话密钥进行数据的加密和解密。
在平时的使用中,我们使用密钥来生成会话密钥,这样可以防止每次连接时都还要输入密码。而之所以使用SSH连接远程电脑是因为环境可以只配置一次,后续直接连接使用,不需要再从新的电脑上安装,配置等等操作。
点击开发机列表中右边的SSH连接,可以查看开发机的SSH密码连接方式,我们根据上面的简介使用本地的SSH连接工具进行连接,这里我使用的连接工具是MobaXterm,是一个针对个人免费的SSH连接工具。
当看到以上的提示信息时,我们就已经成功的连接到开发机了。
2. 配置密钥连接
如果不配置密钥连接的话,我们每次连接开发机都要求输入密码,非常的麻烦,所以我们来配置一个密钥连接。
步骤主要有两步,首先通过 ssh-keygen -t rsa
来生成一个你自己电脑的密钥,然后将这个密钥的公钥添加到开发机中,点击 SSH连接弹出的窗口上方有添加公钥的入口。
首先是在本机输入 ssh-keygen -t rsa
来生成一对密钥。注意一定是在本机输入,不要在开发机中生成。过程中会提示要将密钥生成到什么位置,默认是输入到当前用户的home目录下的.ssh下,会生成两个文件,一个是id_rsa
这是生成的密钥对的私钥,另一个是id_rsa.pub
,它是密钥对的公钥。
通过执行cat
命令(或者在windows下使用文本编辑器打开id_rsa.pub
文件),将文件的内容复制一下,粘贴到开发机的配置里(上面有提到入口)。
保存后,再使用命令直接连接开发机,就不会提示输入密码了。
3. 端口映射
商品映射是一种网络技术,用于将外网的端口映射为某个内网的端口,实现内网与外网的通信。通过端口映射,我们在外网中也可以访问内网中的资源或者服务,实现跨网络的便捷通信。
在后面的学习过程中,我们可能会要使用到开发机中的一些web服务,为了可以在任意的网络中访问到这些web服务,我们就需要对开发机上的端口进行端口映射。
我们可以直接使用ssh命令的一些参数来创建端口映射,在连接的时候增加几个参数就可以实现
例如:
# 原始的ssh连接命令
ssh -p 37367 root@ssh.intern-ai.org.cn -o StrictHostKeyChecking=no
# 将开发机的7860端口映射到本地的7860端口
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
其中,C
代表启用压缩N
;代表只建立隧道,不执行命令;g
代表允许远程主机连接到本地的端口(通常意味着绑定的IP为0.0.0.0);L
为设置转发
在开发机列表中,点击自定义服务,会有指令的提示,忘记的时候可以点开对照着输入。
我们创建一个测试用的web服务
3.1 安装依赖
由于我们的web服务使用了gradio库来创建,所以需要安装这个库,在开发机连接成功后,输入
pip install gradio==4.29.0
来安装
这里最好使用conda create -n xxxx python=3.11 & conda activate xxxx
来创建一个新的环境,防止多个项目对环境产生干扰
3.2 创建服务文件
创建一个名为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.3 开启服务
在开发机hello_world.py
的同目录下输入python hello_world.py
来启动服务。
3.4 访问服务
我们直接在本机打开localhost:7860来访问我们启动的服务即可。
可以看到在本机成功打开了开发机中的目录
二、SSH及端口映射
3.1 文件管理
touch 快速创建文件
>touch demo.py
>ls
mkdir 快速创建目录
>mkdir test
>ls
cd 修改目录
>cd test
>ls
>cd ..
>ls
pwd 查看当前目录
>pwd
cat 查看文件内容
>cat demo.py
vi或vim文本编辑
>vi
Vi有三种模式,编辑模式、命令模式和末行模式
命令模式通过a,i或o来进入编辑模式,编辑模式通过ESC进入命令模式,命令模式通过 :
进入末行模式,末行模式ESC同样可以回到命令模式。
cp 复制
复制文件
cp 源文件 目标文件
>cp demo.py demo1.py
>ls
复制目录
cp -r 源目录 目录目标
>cp -r test test1
>ls
ln 创建链接
链接分成软链接和硬链接两种形式,软链接是产生一种特殊的档案,它指向目标档案,硬链接是一份档案可以有多个名字。因此硬链接只能在同一个文件系统中,而软链接可以跨越不同的文件系统。
ln [参数] [源文件/目录] [目标文件/目录]
mv 移动
-i
交互模式,覆盖前询问-f
强制覆盖-u
只在源比目标新时才移动
>mv [源] [目标]
rm 删除
-i
交互模式,删除前询问-f
强制删除-r
递归删除
>rm -rf test
find 查找命令
find命令是linux中非常强大的命令
- 按文件名查找
-name
find [目标目录] -name [文件名]
- 按文件类型查找
-type
find [目标目录] -type [文件类型]
- 按文件大小查找
-size
find [目标目录] -size +100M
- 按修改时间查找
find [目标目录] -mtime
- 按访问时间
find [目标目录] -atime
- 按状态更改时间
find[目标目录] -ctime
- 按权限查找
find [目标目录] -perm
- 按用户查找
find [目标目录] - user
- 按用户组查找
find [目标目录] --group
- 执行方法
find [目标目录] --exec [代码]
ls 列出目录内容和文件详情
-a
显示所有文件和目录,包括隐藏的-l
以长格式显示详细信息-h
和-l
一起使用,以人类可读的方式显示详细信息-R
递归列出子目录的内容-t
按文件的修改时间排序
sed 流编辑器
主要用于文本处理,它的命令参数包括参数和动作
参数
-e
或--expression
直接在命令行中指定脚本进行文本处理-f
或--file
从指定的脚本文件中读取脚本进行文本处理-n
或-silent
或-quite
仅打印经过输出的结果,不打印未匹配的行
动作
a
在当前行的下一行添加指定的文本字符串c
用指定的文本字符串替换指定范围内的行d
删除指定的行i
在当前行的上一行添加指定的文本字符串p
打印经过选择的行。通常与-n
参数一起使用,只打印匹配的行s
使用正则表达式进行文本替换。例如:s/old/new/g
将所有的old
替换为new
grep 文本搜索
grep是一个强大的文本搜索工具,常用参数如下:
-i
忽略大小写进行搜索-v
反转匹配,即显示不匹配的行-n
显示行号-c
统计匹配的行数
3.2 进程管理
ps 查看正在运行的进程
>ps aux
top 动态显示正在运行的进程
>top
pstree 以树状图的形式显示当前运行的进程及其父子关系
>pstree
pgrep 查找匹配条件的进程
可以根据进程名、用户名等条件查找进程
# 查找特定用户的所有进程
>pgrep -u username
nice 更改进程优先级
nice值越低,优先级越高
>nice -n 10 long-running-command # 以较低优先级运行一个长时间运行的命令
jobs 显示当前终端会话中的作业列表,包括后台运行的进程
>jobs
bg 将挂起的进程放到后台运行
fg 将后台进程调回到前台运行
kill 发送信号到指定的进程,通常用于杀死进程
>kill PID # 杀死指定进程
>kill -9 PID # 强制杀死进程
nvidia-smi命令
显示GPU状态摘要
>nvidia-smi
显示详细的GPU状态信息
>nvidia-smi -l 1 # 1s 更新一次状态信息
列出所有GPU并显示它们的PID和进程名称
>nvidia-smi pmon
强制结束指定GPU的进程
>nvidia-smi --id 0 --ex_pid=12345 # 强制结束 CPU ID为0的显卡上的PID为12345的进程
#### 设置GPU性能模式
```shell
>nvidia-smi -pm 1 # 为所有的GPU设置为性能模式
>nvidia-smi -i 0 -pm 1 # 只针对ID为0的GPU
重启GPU
>nvidia-smi --id=0 -r # 重启ID为0的GPU
显示GPU帮助信息
>nvidia-smi -h
3.3 工具使用
tmux
tmux是一个终端多路复用器,可以在多个终端之间快速切换,分离和将它们重新连接到其它终端中。
使用tmux可以解决程序长时间运行被杀死中断的问题
安装
apt install tmux
3.4 conda
conda 是一个开源的包管理和环境管理系统,可以在Windows、macOS和Linux上运行。它可以快速的安装、运行和更新软件包及依赖项
使用conda可以轻松在本地计算机上创建、保存、加载和切换不同的环境
conda --version 查看版本信息
>conda --version
conda config --show 查看配置信息
>conda config --show
创建虚拟环境
conda create -n python=3.10 # 创建虚拟环境,并在环境中安装3.10版本的python
不指定python版本时,会自动创建基于最新python版本来创建环境
-n
或--name
指定要创建的环境名称-c
或--channel
指定额外的软件包通道--clone
从现有的环境克隆来创建新环境p
或--prefix
指定环境的安装路径
查看有哪些虚拟环境
>conda env list
>conda info -e
>conda info --envs
激活与退出虚拟环境
>conda activte name # 激活虚拟环境
>conda deactivate # 退出虚拟环境
删除与导出虚拟环境
>conda remove --name name --all # 删除某个虚拟环境
>conda remvoe --name name package_name # 删除只钉一个人
# 获得环境中所有的配置
conda env export --name myenv > myenv.yaml
# 还原环境
conda env create -f myenv.yml
conda与pip
- conda可以管理非python包,pip只能管理python包
- conda可以用来创建虚拟环境,pip不能, 需要依赖别的包
- conda安装的库是编译好的代码,安装过程中会自动依赖新的包。
- conda安装 的包会统一下载到当前虚拟环境对应的目录下,下载一次,一次安装;而pip直接下载到对就的环境中。
什么是wheel
它是一种python安装包格式,是预编译的二进制分发格式,类似于conda中的已编译二进制文件。特点有:
- 安装速度快,省略了安装时的编译过程,节省了时间
- 一致性,确保在不同的系统和环境中安装的结果是一致的。