4. Conda和Shell介绍(附加)
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
的版本信息:
当我们要使用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
环境配置中,会影响软件包的安装、更新、环境管理等操作的方式和结果。
4.2 conda环境管理
这一部分是conda
中非常重要的一部分,掌握了这一部分大家就可以将开发环境玩转到飞起了😀。
4.2.1 创建虚拟环境
我们可以使用conda create -n name python=3.10
创建虚拟环境,这里表示创建了python版本为3.10、名字为name的虚拟环境。创建后,可以在.conda
目录下的envs
目录下找到。
直接open folder吧 侧面没显示
在不指定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
同时我们还可以看到环境所在的目录。
4.2.3 激活与退出虚拟环境
当我们创建完虚拟环境后我们可以使用conda activate name
命令来激活虚拟环境,如何查看是否切换成功呢?很简单,只需要看(base)
是否变成了创建的虚拟环境的名称。
如果想要退出虚拟环境的话可以使用:
conda activate conda deactivate
这两条命令都会回到base
环境,因为base
是conda的基础环境,如果仔细观察的话,base
环境目录比其他的虚拟环境目录层级要高。
4.2.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
比如我们将xtuner0.1.17
虚拟环境导出,配置信息是这样的:
其中包括环境名字、虚拟环境软件包的在线存储库的位置和虚拟环境的依赖。后面我们会使用进阶的使用方法来快速的还原虚拟环境。
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 格式能够让安装过程更加顺畅。
4.4 studio-conda使用与Shell(扩展,不需要在开发机中操作)
这一部分属于扩展的部分,因为我觉得这一部分非常有趣,也非常实用,所以如果大家有兴趣的可以学习一下。
我们先来介绍一下studio-conda
,这是开发机内置的一个命令,它通过Shell脚本来实现的。什么是Shell脚本呢?
Shell 脚本 是一种包含一系列命令的文本文件,这些命令按照特定的顺序排列,用于在 Unix/Linux 或类似的操作系统环境中自动执行任务。
Shell 脚本通常使用 Shell 语言编写,常见的 Shell 语言如 Bash、Sh 等,就是我们前面所介绍了Linux基础命令,这就属于Shell语言。
它有以下几个重要特点:
- 自动化:可以将一系列重复、复杂的操作编写为一个脚本,然后只需运行脚本即可自动完成这些操作,从而节省时间和减少错误。例如,每天定时备份重要文件的脚本。
- 系统管理:用于管理系统配置、用户权限、进程控制等。比如,创建新用户并设置其权限的脚本。
- 批处理:能够同时处理多个文件或数据。例如,将一批图片文件从一种格式转换为另一种格式的脚本。
- 流程控制:像条件判断(if-else)、循环(for、while)等,使脚本能够根据不同的情况执行不同的操作。
那studio-conda
就属于自动化的一部分,在我们开发机中root用户的bash环境的配置文件是.bashrc
,但其实主要的配置文件是/share/.aide/config/bashrc
,在这个文件里面写了一些命令,可以让我们更快捷的执行一些操作,比如:
export no_proxy='localhost,127.0.0.1,0.0.0.0,172.18.47.140' export PATH=/root/.local/bin:$PATH export HF_ENDPOINT='https://hf-mirror.com' alias studio-conda="/share/install_conda_env.sh" alias studio-smi="/share/studio-smi"
export
是用来设置环境变量的,alias
是将一个sh文件复制为一个变量,这个可以作为命令在终端中执行,我们的studio-conda
就是这样的。
这里的studio-smi
是用来查看查看虚拟内存占用的,当我们打开/share/studio-smi
文件可以看到:
#!/bin/bash if command -v vgpu-smi &> /dev/null then echo "Running studio-smi by vgpu-smi" vgpu-smi else echo "Running studio-smi by nvidia-smi" nvidia-smi fi
这个脚本是用于检查系统中是否存在 vgpu-smi
命令,如果存在,它将运行 vgpu-smi
来显示虚拟 GPU (vGPU) 的状态信息;如果不存在,它将运行 nvidia-smi
来显示 NVIDIA GPU 的状态信息。如下图所示:
nvidia-smi
是用于监控和管理物理 NVIDIA GPU 设备的工具,而 vgpu-smi
专门用于监控和管理通过 NVIDIA vGPU 技术虚拟化的 GPU 资源。
我们查看/share/install_conda_env.sh
文件内容如下:
#!/bin/bash # clone internlm-base conda env to user's conda env # created by xj on 01.07.2024 # modifed by xj on 01.19.2024 to fix bug of conda env clone # modified by ljy on 01.26.2024 to extend XTUNER_UPDATE_DATE=`cat /share/repos/UPDATE | grep xtuner |awk -F= '{print $2}'` HOME_DIR=/root CONDA_HOME=$HOME_DIR/.conda SHARE_CONDA_HOME=/share/conda_envs SHARE_HOME=/share list() { cat <<-EOF 预设环境 描述 internlm-base pytorch:2.0.1, pytorch-cuda:11.7 xtuner Xtuner(源码安装: main $(echo -e "\033[4mhttps://github.com/InternLM/xtuner/tree/main\033[0m"), 更新日期:$XTUNER_UPDATE_DATE) pytorch-2.1.2 pytorch:2.1.2, pytorch-cuda:11.8 EOF } help() { cat <<-EOF 说明: 用于快速clone预设的conda环境 使用: 1. studio-conda env -l/list 打印预设的conda环境列表 2. studio-conda <target-conda-name> 快速clone: 默认拷贝internlm-base conda环境 3. studio-conda -t <target-conda-name> -o <origin-conda-name> 将预设的conda环境拷贝到指定的conda环境 EOF } clone() { source=$1 target=$2 if [[ -z "$source" || -z "$target" ]]; then echo -e "\033[31m 输入不符合规范 \033[0m" help exit 1 fi if [ ! -d "${SHARE_CONDA_HOME}/$source" ]; then echo -e "\033[34m 指定的预设环境: $source不存在\033[0m" list exit 1 fi if [ -d "${CONDA_HOME}/envs/$target" ]; then echo -e "\033[34m 指定conda环境的目录: ${CONDA_HOME}/envs/$target已存在, 将清空原目录安装 \033[0m" wait_echo& wait_pid=$! rm -rf "${CONDA_HOME}/envs/$target" kill $wait_pid fi echo -e "\033[34m [1/2] 开始安装conda环境: <$target>. \033[0m" sleep 3 tar --skip-old-files -xzvf /share/pkgs.tar.gz -C ${CONDA_HOME} wait_echo& wait_pid=$! conda create -n $target --clone ${SHARE_CONDA_HOME}/${source} if [ $? -ne 0 ]; then echo -e "\033[31m 初始化conda环境: ${target}失败 \033[0m" exit 10 fi kill $wait_pid # for xtuner, re-install dependencies case "$source" in xtuner) source_install_xtuner $target ;; esac echo -e "\033[34m [2/2] 同步当前conda环境至jupyterlab kernel \033[0m" lab add $target source $CONDA_HOME/bin/activate $target cd $HOME_DIR echo -e "\033[32m conda环境: $target安装成功! \033[0m" echo """ ============================================ ALL DONE! ============================================ """ } ······ dispatch $@
其中的*list
*()
等,都是studio-conda
的函数,可以实现某些操作,比如我们可以使用studio-conda env list
来查看预设的环境:
其中*clone
*()
函数的主要作用就是用来复制环境的,不过只能从预设的环境中进行复制,主要的代码其实就是:
tar --skip-old-files -xzvf /share/pkgs.tar.gz -C ${CONDA_HOME} conda create -n $target --clone ${SHARE_CONDA_HOME}/${source}
解压预设环境的压缩包,然后通过clone创建虚拟环境,不过在Shell脚本中还设置了一些逻辑,不过都是一些判断,如果你熟悉任何一种编程语言应该都可以看懂,如果看不懂问题也不大。
那么我们如何将我们自己创建的环境添加到studio-conda
中呢?
第一步,将新的conda环境创建到/share/conda_envs下
conda create -p /share/conda_envs/xxx python=3.1x
第二步,将本机/root/.conda/pkgs下的文件拷贝到/share/pkgs中,重新压缩并替换(此步骤是为了把conda创建过程中大的公共包存储起来,避免重复下载)
cp -r -n /root/.conda/pkgs/* /share/pkgs/
cd /share && tar -zcvf pkgs.tar.gz pkgs
第三步,更新install_conda_env.sh中的list函数,增加新的conda环境说明。
上面是开发机默认提供的方法,其实还有一种方法,我们前面使用conda
导出过xtuner0.1.17
虚拟环境的配置文件,我们可以使用conda env create -f xtuner0.1.17.yml
命令来还原虚拟环境。下面我们来写一个简单的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 xtuner0.1.17
并按下回车就可以还原虚拟环境了。
不过这种跟直接使用没什么太大区别,如果将这种操作与开发机中的studio-conda
命令结合起来会非常方便,不过由于复制环境的方法不太一样。所以如果要实现需要对/share/install_conda_env.sh
文件的逻辑进行修改。
好了,以上就是我们本关卡的全部内容了,希望上面的内容对大家后面学习有帮助,如果大家想要学习更多linux的相关知识,可以看我博客文章,虽然说不会linux对我们学习大模型没有太大影响,但是linux如果学习的很好,会让你在学习大模型的路上非常顺畅的。最后大家不要忘了完成我们前面设置的关卡呦!
博客链接:linux
常见问题
1. InternStudio 开发机的环境玩坏了,如何初始化开发机环境
慎重执行!!!!所有数据将会丢失,仅限 InternStudio 平台,自己的机器千万别这么操作
- 第一步本地终端 ssh 连上开发机(一定要 ssh 连接上操作,不能在 web 里面操作!!!)
- 第二步执行
rm -rf /root
,大概会等待10分钟 - 第三步重启开发机,系统会重置 /root 路径下的配置文件
- 第四步
ln -s /share /root/share
Copied!