Conda

4. Conda和Shell介绍(附加)

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的版本信息:

当我们要使用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进行包的安装的,后面我们会介绍pipconda的区别。

如果我们想要查看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

这部分我们介绍一些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 格式能够让安装过程更加顺畅。

4.4 studio-conda使用与Shell(扩展,不需要在开发机中操作)

这一部分属于扩展的部分,因为我觉得这一部分非常有趣,也非常实用,所以如果大家有兴趣的可以学习一下。

我们先来介绍一下studio-conda,这是开发机内置的一个命令,它通过Shell脚本来实现的。什么是Shell脚本呢?

Shell 脚本 是一种包含一系列命令的文本文件,这些命令按照特定的顺序排列,用于在 Unix/Linux 或类似的操作系统环境中自动执行任务。

Shell 脚本通常使用 Shell 语言编写,常见的 Shell 语言如 Bash、Sh 等,就是我们前面所介绍了Linux基础命令,这就属于Shell语言。

它有以下几个重要特点:

  1. 自动化:可以将一系列重复、复杂的操作编写为一个脚本,然后只需运行脚本即可自动完成这些操作,从而节省时间和减少错误。例如,每天定时备份重要文件的脚本。
  2. 系统管理:用于管理系统配置、用户权限、进程控制等。比如,创建新用户并设置其权限的脚本。
  3. 批处理:能够同时处理多个文件或数据。例如,将一批图片文件从一种格式转换为另一种格式的脚本。
  4. 流程控制:像条件判断(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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值