2024-11-21 一站式 AI 平台生日大派对!2024-11-21 一站式 AI 平台生日大派对! 无问芯穹特别推出多项超值福利!立即参与
Skip to content

在开发机中使用 Conda

本文主要介绍如何在开发机中使用镜像自带的 Conda 环境。

镜像自带 vs 自行安装

智算云平台预置了基于 Ubuntu、CentOS 的多种基础镜像和第三方镜像,绝大部分已自带 Miniconda,一般在 /usr/local/ 下的目录。

如果使用预置镜像,不妨使用镜像自带 Miniconda,免去自行下载安装的麻烦。镜像自带 Miniconda 一般在 /usr/local 目录下。

以下内容无特殊说明,均为镜像自带 Miniconda,使用 root 用户。

SSH 远程终端中使用 Conda

完成 SSH 远程登录后,可查看当前环境下可否直接使用 conda

bash
which conda

期待结果是输出类似下方的 Conda 安装路径:

bash
/usr/local/miniconda3

NOTE

如果 which conda 输出路径,则说明镜像自带 Miniconda 直接可用,可正常使用 conda 命令,请跳过该部分剩余内容。

如果 which conda 没有输出,有可能是环境变量缺失,或镜像中未自带 Conda。

先尝试查找 Miniconda 安装路径:

bash
find / -name "miniconda*"
# 或只查目录,且排除错误输出
find / -type d -name "miniconda*" 2>/dev/null

如果 find 命令找到了 Miniconda,则会输出类似下方的安装路径:

bash
/usr/local/miniconda3

如果未输出类似路径,则说明镜像中不包含 Miniconda,您需要自行安装。如果输出类似路径,说明只是未初始化 Conda 环境。执行以下步骤,手动初始化 Conda 环境:

bash
# 临时设置环境变量,请根据 conda 路径调整下方命令
export PATH="/usr/local/miniconda3/bin:$PATH"
# 初始化 Conda 环境
conda init

conda init 是 Conda 官方推荐的设置方法,会自动处理所有必要的配置,修改会被持久化到 .bashrc 中。

如此处理完之后,根据提示退出重新登录,即可使用 conda 命令。

Web Terminal 中使用 Conda

在 Web Terminal 中使用镜像自带 Conda 可能会遇到权限问题。如开发机中从未初始化 Conda 环境,请先完成初始化,再参考后续的解决方案。

初始化 Conda

先尝试直接运行 which conda,确定镜像中已包含 Conda 环境。如果输出路径,说明当前环境下 Conda 可用。

如果未输出路径,可尝试初始化 Conda 环境:

bash
conda init

根据 conda init 提示退出重新登录,即可使用 conda 命令。如果提示找不到 conda 命令,则说明镜像中不包含 Conda 环境。

NOTE

conda init 是 Conda 官方推荐的设置方法,会自动处理所有必要的配置,修改会被持久化到 .bashrc 中。

常见问题

修改默认 Conda 源为清华镜像源

由于国内网络问题,可能无法访问 Conda 自带源,或访问速度极慢。因此,建议使用国内镜像源,如清华镜像源。

下面示例使用 cat 命令直接追加写入了 ~/.condarc,请注意勿重复添加。

bash
# 添加清华镜像源。
cat << EOF >> ~/.condarc
channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
  nvidia: https://mirrors.sustech.edu.cn/anaconda-extra/cloud
EOF

然后清除相关缓存:

bash
conda clean -i
conda clean -p
conda clean -a

无法激活 Conda 环境

从 Web Terminal 登录开发机,使用 which conda 验证已安装 Miniconda,已有 base 环境,但直接运行 conda activate base 会报错(激活其他环境也会报错),提示需要先运行 conda init

conda init 命令用于初始化 Conda,主要是为了配置用户的环境,以便 Conda 命令能够在用户的 shell 中正确运行。

alt text

运行 conda init 命令,初始化 Conda 环境,并重启终端。

alt text

非 root 用户的文件路径权限问题

TIP

AIStudio 开发机已变更为默认使用 root 账号登录。部分旧版开发机仍默认使用非 root 账号,重启后可自动更新。不需要使用以下方案解决非 root 用户权限问题。

root 用户使用镜像自带 Miniconda 可能会遇到文件读写权限问题。

镜像自带 Miniconda 一般在 /usr/local 目录。可通过以下命令查看 Miniconda 使用的路径:

bash
conda info

开发机 Web Terminal 环境特殊,暂时使用 conda create 会遇到文件权限错误,无法简单通过 sudo 提升至 root 权限解决问题。如果对从 Web Terminal 使用 Conda 命令有强需求,请参考下文推荐方案一/方案二。

方案一 修改 pkgs 路径

在 Web Terminal 执行 conda create 时,默认会以 /usr/local 下的子目录作为 pkgs 路径,遇到权限不足的问题时,会直接报错。

因此,可以修改 conda 配置,将 pkgs 路径修改为 ~/.conda/pkgs,这样就可以避免文件权限问题。

bash
# 创建 pkgs 目录
mkdir -p ~/.conda/pkgs
# 修改 .condarc 配置
conda config --add pkgs_dirs ~/.conda/pkgs
# 检查 conda 配置是否成功,输出 pkgs 路径如果只有 1 个,则说明配置成功
conda config --show-sources

配置完毕后,conda create 命令即可正常执行。

方案二 自行安装 Miniconda

您也可以放弃使用镜像自带 Miniconda,自行安装理想的 Conda 环境。自行安装的 Conda 默认在用户目录下,一般不会遇到权限问题。

安装 Miniconda

bash
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

初始化 Miniconda

bash
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh

非 root 用户无法创建 Conda 环境

TIP

AIStudio 开发机已变更为默认使用 root 账号登录。部分旧版开发机仍默认使用非 root 账号,重启后可自动更新。不需要使用以下方案解决非 root 用户权限问题。

从开发机的 Web Terminal 登录,使用 conda create 命令创建 Conda 环境,会直接报错。这是因为开发机的 Web Terminal 环境特殊,暂时无法直接支持使用 conda create

遇到这类错误,请参考上文 非 root 用户的文件路径权限问题 部分的解决方案。

Ubuntu 报错示例:

bash
demo@is-c7w2uhk76efvlcfa-devmachine-0:~$ conda create -n fromwebterm python==3.12.4
Channels:
 - defaults
Platform: linux-64
Collecting package metadata (repodata.json): failed
NotWritableError: The current user does not have write permissions to a required path.
  path: /usr/local/miniconda3/pkgs/cache/47929eba.json
  uid: 30508
  gid: 0
If you feel that permissions on this path are set incorrectly, you can manually
change them by executing
  $ sudo chown 30508:0 /usr/local/miniconda3/pkgs/cache/47929eba.json
In general, it's not advisable to use 'sudo conda'.
demo@is-c7w2uhk76efvlcfa-devmachine-0:~$

CentOS 报错示例:

bash
[zhaoyinghao@is-c7wqsja2wznj73pe-devmachine-0 ~]$ conda create -name web python==3.12.4
Collecting package metadata (current_repodata.json): failed

# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

    Traceback (most recent call last):
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/exception_handler.py", line 16, in __call__
        return func(*args, **kwargs)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/cli/main.py", line 84, in main_subshell
        exit_code = do_call(args, p)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/cli/conda_argparse.py", line 126, in do_call
        return getattr(module, func_name)(args, parser)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/notices/core.py", line 123, in wrapper
        return func(*args, **kwargs)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/cli/main_create.py", line 46, in execute
        install(args, parser, "create")
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/cli/install.py", line 309, in install
        unlink_link_transaction = solver.solve_for_transaction(
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/solve.py", line 153, in solve_for_transaction
        unlink_precs, link_precs = self.solve_for_diff(
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/solve.py", line 214, in solve_for_diff
        final_precs = self.solve_final_state(
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/solve.py", line 357, in solve_final_state
        ssc = self._collect_all_metadata(ssc)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/common/io.py", line 83, in decorated
        return f(*args, **kwds)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/solve.py", line 571, in _collect_all_metadata
        index, r = self._prepare(prepared_specs)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/solve.py", line 1285, in _prepare
        reduced_index = get_reduced_index(
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/index.py", line 286, in get_reduced_index
        new_records = SubdirData.query_all(
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/core/subdir_data.py", line 123, in query_all
        create_cache_dir()
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/gateways/repodata/__init__.py", line 994, in create_cache_dir
        mkdir_p_sudo_safe(cache_dir)
      File "/usr/local/lib/miniconda3/lib/python3.9/site-packages/conda/gateways/disk/__init__.py", line 87, in mkdir_p_sudo_safe
        os.mkdir(path)
    PermissionError: [Errno 13] Permission denied: '/usr/local/lib/miniconda3/pkgs/cache'

`$ /usr/local/lib/miniconda3/bin/conda create -name web python==3.12.4`

  environment variables:
                 CIO_TEST=<not set>
                CONDA_DIR=/usr/local/lib/miniconda3
                CONDA_EXE=/usr/local/lib/miniconda3/bin/conda
         CONDA_PYTHON_EXE=/usr/local/lib/miniconda3/bin/python
               CONDA_ROOT=/usr/local/lib/miniconda3
              CONDA_SHLVL=0
           CURL_CA_BUNDLE=<not set>
          LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/gcc/lib64:/usr/local/gcc/lib::/usr/lo
                          cal/lib
               LD_PRELOAD=<not set>
             LIBRARY_PATH=/usr/local/cuda/lib64/stubs
                     PATH=/usr/local/lib/miniconda3/condabin:/usr/local/cuda/bin:/usr/local/gcc/
                          bin:/usr/local/lib/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/
                          sbin:/usr/bin:/sbin:/bin:/home/zhaoyinghao/.local/bin:/home/zhaoyingha
                          o/bin
       REQUESTS_CA_BUNDLE=<not set>
            SSL_CERT_FILE=<not set>

     active environment : None
            shell level : 0
       user config file : /home/zhaoyinghao/.condarc
 populated config files : 
          conda version : 23.5.0
    conda-build version : not installed
         python version : 3.9.12.final.0
       virtual packages : __archspec=1=x86_64
                          __cuda=12.2=0
                          __glibc=2.17=0
                          __linux=5.15.0=0
                          __unix=0=0
       base environment : /usr/local/lib/miniconda3  (read only)
      conda av data dir : /usr/local/lib/miniconda3/etc/conda
  conda av metadata url : None
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /usr/local/lib/miniconda3/pkgs
                          /home/zhaoyinghao/.conda/pkgs
       envs directories : /home/zhaoyinghao/.conda/envs
                          /usr/local/lib/miniconda3/envs
               platform : linux-64
             user-agent : conda/23.5.0 requests/2.27.1 CPython/3.9.12 Linux/5.15.0-113-generic centos/7.9.2009 glibc/2.17
                UID:GID : 30509:0
             netrc file : None
           offline mode : False


An unexpected error has occurred. Conda has prepared the above report.

If submitted, this report will be used by core maintainers to improve
future releases of conda.
Would you like conda to send this report to the core maintainers? [y/N]: n

No report sent. To permanently opt-out, use

    $ conda config --set report_errors false

[zhaoyinghao@is-c7wqsja2wznj73pe-devmachine-0 ~]$