书生大模型实战营第四期-入门岛-1. Linux前置基础

入门岛-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 直接显示文件全部内容,moreless 可以分页查看。
  • 编辑文件:如 vivim 等编辑器。
  • 复制文件:用 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工具使用

这里介绍一个工具TMUXTMUX 是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。

具体的使用方法可以查看:

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是怎么实现的。

我们会从下面几部分进行介绍:

  1. conda设置
  2. conda环境管理
  3. conda和pip
  4. 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.com
  pkgs/r: https://repo.anaconda.com
  pkgs/pro: https://repo.anaconda.com
custom_multichannels:
  defaults: 
    - https://repo.anaconda.com/pkgs/main
    - https://repo.anaconda.com/pkgs/r
  local: 
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-dev

  added / updated specs:
    - python=3.10


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    ca-certificates-2024.7.2   |       h06a4308_0         127 KB  defaults
    openssl-3.0.14             |       h5eee18b_0         5.2 MB  defaults
    pip-24.2                   |  py310h06a4308_0         2.3 MB  defaults
    setuptools-72.1.0          |  py310h06a4308_0         2.4 MB  defaults
    ------------------------------------------------------------
                                           Total:        10.0 MB

The 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)? y


Downloading 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

这部分我们介绍一些condapip的一些区别:

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

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

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

Wheel 格式的主要优点包括:

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

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

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

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

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

Wheel 格式的主要优点包括:

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

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

上一篇:学习threejs,导入STL格式的模型


下一篇:前端代码分析题(选择题、分析题)——JS事件循环分析、await和作用域分析