入门岛-Linux前置基础
书生大模型实战营-第四期-Linux前置基础:
任务:https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md
文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux
任务描述 | 完成所需时间 | |
---|---|---|
闯关任务 | 完成SSH连接与端口映射并运行hello_world.py | 10min |
可选任务 1 | 将Linux基础命令在开发机上完成一遍 | 10min |
可选任务 2 | 使用 VSCODE 远程连接开发机并创建一个conda环境 | 10min |
1. InternStudio开发机介绍
2. SSH及端口映射(闯关任务)
创建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/202410081252022.png" alt="Logo" width="50%" style="border-radius: 5px;"></a></p>"""gr.Markdown(html_code)demo.launch()
运行:python hello_world.py
备注:
安装依赖:
pip install gradio==4.29.0
运行后vscode会自动配置端口映射,打开浏览器即可访问。也可以参考如下命令手动进行SSH端口映射。
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:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
3. Linux 基础命令(可选任务1)
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.2 进程管理
进程管理命令是进行系统监控和进程管理时的重要工具,常用的进程管理命令有以下几种:
- ps:查看正在运行的进程
- top:动态显示正在运行的进程
- pstree:树状查看正在运行的进程
- pgrep:用于查找进程
- nice:更改进程的优先级
- jobs:显示进程的相关信息
- bg 和 fg:将进程调入后台
- kill:杀死进程
3.3 nvidia-smi
以下是 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.4 TMUX工具使用
这里介绍一个工具TMUX
,TMUX
是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。
具体的使用方法可以查看:
https://www.ruanyifeng.com/blog/2019/10/tmux.html
4. Conda介绍
Conda 是一个开源的包管理和环境管理系统,可在 Windows、macOS 和 Linux 上运行,用于安装、运行和更新软件包及其依赖项。使用 Conda可以轻松在本地计算机上创建、保存、加载和切换不同的环境。
在开发机中已经安装了conda
,我们可以直接使用,而且开发机中也有内置的conda
命令studio-conda
,下面我们会介绍conda
的基本使用,还有studio-conda
的使用方法以及介绍一下studio-conda
是怎么实现的。
我们会从下面几部分进行介绍:
- conda设置
- conda环境管理
- conda和pip
- studio-conda使用与Shell(扩展)
4.1 conda设置
我们可以使用conda --version
来查看当前开发机中conda
的版本信息:
(base) root@intern-studio-50014188:~# conda --version
conda 23.9.0
当我们要使用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
如果我们想要查看conda的配置信息可以使用conda config --show
命令:
(base) root@intern-studio-50014188:~# conda config --show
add_anaconda_token: True
add_pip_as_python_dependency: True
aggressive_update_packages:- ca-certificates- certifi- openssl
allow_conda_downgrades: False
allow_cycles: True
allow_non_channel_urls: False
allow_softlinks: False
allowlist_channels: []
always_copy: False
always_softlink: False
always_yes: None
anaconda_upload: None
auto_activate_base: True
auto_stack: 0
auto_update_conda: True
bld_path:
changeps1: True
channel_alias: https://conda.anaconda.org
channel_priority: flexible
channel_settings: []
channels:- defaults
client_ssl_cert: None
client_ssl_cert_key: None
clobber: False
conda_build: {}
create_default_packages: []
croot: /root/.conda/conda-bld
custom_channels:pkgs/main: https://repo.anaconda.compkgs/r: https://repo.anaconda.compkgs/pro: https://repo.anaconda.com
custom_multichannels:defaults: - https://repo.anaconda.com/pkgs/main- https://repo.anaconda.com/pkgs/rlocal:
debug: False
default_channels:- https://repo.anaconda.com/pkgs/main- https://repo.anaconda.com/pkgs/r
default_python: 3.11
default_threads: None
deps_modifier: not_set
dev: False
disallowed_packages: []
download_only: False
dry_run: False
enable_private_envs: False
env_prompt: ({default_env})
envs_dirs:- /root/.conda/envs
error_upload_url: https://conda.io/conda-post/unexpected-error
execute_threads: 1
experimental: []
extra_safety_checks: False
fetch_threads: 5
force: False
force_32bit: False
force_reinstall: False
force_remove: False
ignore_pinned: False
json: False
local_repodata_ttl: 1
migrated_channel_aliases: []
migrated_custom_channels: {}
no_lock: False
no_plugins: False
non_admin_enabled: True
notify_outdated_conda: True
number_channel_notices: 5
offline: False
override_channels_enabled: True
path_conflict: clobber
pinned_packages: []
pip_interop_enabled: False
pkgs_dirs:- /root/.conda/pkgs
proxy_servers: {}
quiet: False
register_envs: True
remote_backoff_factor: 1
remote_connect_timeout_secs: 9.15
remote_max_retries: 3
remote_read_timeout_secs: 60.0
repodata_fns:- current_repodata.json- repodata.json
repodata_threads: None
report_errors: None
restore_free_channel: False
rollback_enabled: True
root_prefix: /root/.conda
safety_checks: warn
sat_solver: pycosat
separate_format_cache: False
shortcuts: True
show_channel_urls: None
signing_metadata_url_base: None
solver: classic
solver_ignore_timestamps: False
ssl_verify: True
subdir: linux-64
subdirs:- linux-64- noarch
target_prefix_override:
trace: False
track_features: []
unsatisfiable_hints: True
unsatisfiable_hints_check_depth: 2
update_modifier: update_specs
use_index_cache: False
use_local: False
use_only_tar_bz2: False
verbosity: 0
verify_threads: 1
这些配置在Conda
环境配置中,会影响软件包的安装、更新、环境管理等操作的方式和结果。
4.2 conda环境管理
这一部分是conda
中非常重要的一部分,掌握了这一部分大家就可以将开发环境玩转到飞起了。
4.2.1 创建虚拟环境(可选任务2)
我们可以使用conda create -n name python=3.10
创建虚拟环境,这里表示创建了python版本为3.10、名字为name的虚拟环境。创建后,可以在.conda
目录下的envs
目录下找到。
conda create -n <env-name> python=3.10# 创建一个名为env-py310-dev,python3.10的虚拟环境
conda create -n env-py310-dev python=3.10
(base) root@intern-studio-50014188:~# conda create -n env-py310-dev python=3.10
Collecting package metadata (current_repodata.json): done
Solving environment: done## Package Plan ##environment location: /root/.conda/envs/env-py310-devadded / updated specs:- python=3.10The following packages will be downloaded:package | build---------------------------|-----------------ca-certificates-2024.7.2 | h06a4308_0 127 KB defaultsopenssl-3.0.14 | h5eee18b_0 5.2 MB defaultspip-24.2 | py310h06a4308_0 2.3 MB defaultssetuptools-72.1.0 | py310h06a4308_0 2.4 MB defaults------------------------------------------------------------Total: 10.0 MBThe following NEW packages will be INSTALLED:_libgcc_mutex anaconda/pkgs/main/linux-64::_libgcc_mutex-0.1-main _openmp_mutex anaconda/pkgs/main/linux-64::_openmp_mutex-5.1-1_gnu bzip2 anaconda/pkgs/main/linux-64::bzip2-1.0.8-h5eee18b_6 ca-certificates anaconda/pkgs/main/linux-64::ca-certificates-2024.7.2-h06a4308_0 ld_impl_linux-64 anaconda/pkgs/main/linux-64::ld_impl_linux-64-2.38-h1181459_1 libffi anaconda/pkgs/main/linux-64::libffi-3.4.4-h6a678d5_1 libgcc-ng anaconda/pkgs/main/linux-64::libgcc-ng-11.2.0-h1234567_1 libgomp anaconda/pkgs/main/linux-64::libgomp-11.2.0-h1234567_1 libstdcxx-ng anaconda/pkgs/main/linux-64::libstdcxx-ng-11.2.0-h1234567_1 libuuid anaconda/pkgs/main/linux-64::libuuid-1.41.5-h5eee18b_0 ncurses anaconda/pkgs/main/linux-64::ncurses-6.4-h6a678d5_0 openssl anaconda/pkgs/main/linux-64::openssl-3.0.14-h5eee18b_0 pip anaconda/pkgs/main/linux-64::pip-24.2-py310h06a4308_0 python anaconda/pkgs/main/linux-64::python-3.10.14-h955ad1f_1 readline anaconda/pkgs/main/linux-64::readline-8.2-h5eee18b_0 setuptools anaconda/pkgs/main/linux-64::setuptools-72.1.0-py310h06a4308_0 sqlite anaconda/pkgs/main/linux-64::sqlite-3.45.3-h5eee18b_0 tk anaconda/pkgs/main/linux-64::tk-8.6.14-h39e8969_0 tzdata anaconda/pkgs/main/noarch::tzdata-2024a-h04d1e81_0 wheel anaconda/pkgs/main/linux-64::wheel-0.43.0-py310h06a4308_0 xz anaconda/pkgs/main/linux-64::xz-5.4.6-h5eee18b_1 zlib anaconda/pkgs/main/linux-64::zlib-1.2.13-h5eee18b_1 Proceed ([y]/n)? yDownloading and Extracting Packages:Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate env-py310-dev
#
# To deactivate an active environment, use
#
# $ conda deactivate
在不指定python版本时,会自动创建基于最新python版本的虚拟环境。同时我们可以在创建虚拟环境的同时安装必要的包:conda create -n name numpy matplotlib python=3.10
(但是不建议大家这样用)
创建虚拟环境的常用参数如下:
- -n 或 --name:指定要创建的环境名称。
- -c 或 --channel:指定额外的软件包通道。
- –clone:从现有的环境克隆来创建新环境。
- -p 或 --prefix:指定环境的安装路径(非默认位置)。
4.2.2 查看有哪些虚拟环境
如果想要查看有哪些虚拟环境我们可以使用下面的命令:
conda env list
conda info -e
conda info --envs# 上面三个命令输出结果是一样的。同时还可以看到环境所在的目录。
(base) root@intern-studio-50014188:~# conda env list
# conda environments:
#
base * /root/.conda
crawler /root/.conda/envs/crawler
env-py310-dev /root/.conda/envs/env-py310-dev
llama3 /root/.conda/envs/llama3
llama3_2 /root/.conda/envs/llama3_2
lmdeploy /root/.conda/envs/lmdeploy
opencompass /root/.conda/envs/opencompass
qwen /root/.conda/envs/qwen
4.2.3 激活与退出虚拟环境
# 激活虚拟环境
(base) root@intern-studio-50014188:~# conda activate env-py310-dev# 关闭虚拟环境
(env-py310-dev) root@intern-studio-50014188:~# conda activate
(base) root@intern-studio-50014188:~#
# 或者使用deacivate
(env-py310-dev) root@intern-studio-50014188:~# conda deactivate
(base) root@intern-studio-50014188:~#
上述两条命令都会回到base
环境,因为base
是conda的基础环境,如果仔细观察的话,base
环境目录比其他的虚拟环境目录层级要高。
4.2.4 删除与导出虚拟环境
如果想要删除某个虚拟环境可以使用conda remove --name env-py310-dev --all
,如果只删除虚拟环境中的某个或者某些包可以使用conda remove --name env-py310-dev package_name
导出虚拟环境对于特定的环境是非常有必要的,因为有些软件包的依赖关系很复杂,如果自己重新进行创建和配置的话很麻烦,如果我们将配置好的环境导出,这样下次使用还原就行了,而且也可以把配置分享给其他人。
#获得环境中的所有配置
conda env export --name opencompass > opencompass.yml#重新还原环境
conda env create -f opencompass.yml
比如我们将opencompass
虚拟环境导出,配置信息是这样的:
name: opencompass
channels:- pytorch- nvidia- defaults
dependencies:- _libgcc_mutex=0.1=main- _openmp_mutex=5.1=1_gnu- blas=1.0=mkl- brotli-python=1.0.9=py310h6a678d5_8- bzip2=1.0.8=h5eee18b_6- ca-certificates=2024.3.11=h06a4308_0
...- yaml=0.2.5=h7b6447c_0- zlib=1.2.13=h5eee18b_1- zstd=1.5.5=hc292b87_2- pip:- absl-py==2.1.0- accelerate==0.30.0- addict==2.4.0- aiohttp==3.9.5- aiosignal==1.3.1...- wcwidth==0.2.13- xxhash==3.4.1- yapf==0.40.2- yarl==1.9.4- zipp==3.18.1
prefix: /root/.conda/envs/opencompass
其中包括环境名字、虚拟环境软件包的在线存储库的位置和虚拟环境的依赖。后面我们会使用进阶的使用方法来快速的还原虚拟环境。
4.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 格式能够让安装过程更加顺畅。
python包,pip只能管理python包。
- conda可以用来创建虚拟环境,pip不能,需要依赖virtualenv之类的包。
- conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
- conda安装的包会统一下载到当前虚拟环境对应的目录下,下载一次多次安装。pip是直接下载到对应环境中。
Wheel 是一种 Python 安装包的格式。
它是一种预编译的二进制分发格式,类似于 conda 中的已编译二进制文件。
Wheel 格式的主要优点包括:
- 安装速度快:因为已经进行了预编译,所以在安装时不需要像源码安装那样进行编译过程,节省了时间。
- 一致性:确保在不同的系统和环境中安装的结果是一致的。
例如,如果您要安装一个大型的 Python 库,使用 Wheel 格式可以避免在不同的机器上因为编译环境的差异而导致的安装问题。而且,对于那些没有编译环境或者编译能力较弱的系统,Wheel 格式能够让安装过程更加顺畅。