93. Anaconda配置

Anaconda创建的虚拟环境多用户共享访问使用

在服务器上的sudo用户安装了anaconda,假设现在配置了虚拟的环境pytorch,需要怎么设置配置文件,才能保证连接服务器的别的标准用户(不具有sudo权限)怎么可以用到这个环境.

软件下载

建议使用国内源,例如清华大学开源软件镜像站。下载对应架构的安装包,例如 Anaconda3-2022.05-Linux-x86_64.sh。注意下载的是 anaconda3。下面假定你在 root 用户中执行指令,并且之前没有安装过 anaconda。

软件安装

  1. 运行下载的文件

    通过 chmod +x 为它增加执行权限

  2. 回车开始安装

  3. 阅读并输入 yes

  4. 指定安装目录,例如 /opt/anaconda3. (不要放在 root 根目录(~)下。)

  5. 等待安装完成

用户组与目录权限

为了使 anaconda 的文件仍归 root 所有,我们将新建一个用户组来为其余用户提供访问权限

1
2
3
4
5
6
groupadd condagroup # 新建一个名为 condagroup 的组;可以使用其它名称
adduser <username> condagroup # 将需要的用户加入该组
chgrp -R condagroup /opt/anaconda3 # 将安装目录转给该组
chmod 770 -R /opt/anaconda3 # 设置 root 用户与 condagroup 组的读写权限
find /opt/anaconda3 -type d -exec chmod g+s {} + # 设置组继承,使以后新建的文件夹仍属于 condagroup 组
chmod g-w /opt/anaconda3/envs # 共享环境只能由 root 修改

新环境位置

接下来,为了确保其余用户可以正确地在自己的目录中使用 -n <name> 新建环境,还要创建系统级的 anaconda 配置文件。在安装目录下(/opt/anaconda3)新建.condarc文件并写入

1
2
3
envs_dirs:
- /opt/anaconda3/envs
- ~/.conda/envs

根据 Conda configuration,envs_dirs是搜索命名环境的目录列表。创建新的命名环境时将放置在第一个可写位置,因此 root 用户将默认创建在安装目录下,成为共享环境,而其余用户会创建在自己的主目录中。

关于更多的管理选项,参见 Administering a multi-user conda installation。

你可能会想把这个文件的权限设为 644来避免被其余用户改动。这也是默认行为,因为 root 用户的默认 umask 是 0022。我们接下来将介绍这个 umask 可能带来的问题。

关于 umask

umask 控制新建文件的权限,简单来说是对指定的权限位进行排除。详细信息参见它的维基百科。

前述文件共享的机制是通过组读写权限完成的,意味着 anaconda 的文件需要有用户组的读与写权限。普通用户的默认 umask 是 0002,提供了用户组写仅限,但 root 用户的0022并没有。因此在使用 root 用户创建共享环境前需要修改 umask。

1
2
3
umask 0002
conda create -n env_name python # 示例
umask 0022 # 你可能会想恢复原值

否则会导致其它用户无权访问某些新下载的包的缓存等问题。在这种情况下,可以找到相应的文件并为其附加用户组写权限chmod g+w。

新增用户

现在你已经安装好了想要的 anaconda。如果有新用户,只需将其加入condagroup用户组,即可使用共享环境或创建新环境。

conda 环境配置

方法1: 局部(用户)配置 (Recommend)

以普通用户执行如下操作, 但是需要在所有的权限设置完毕之后方可使用

  1. 运行命令 eval "$(/opt/anaconda3/bin/conda shell.<YOUR_SHELL_NAME> hook)"

    如: eval "$(/opt/anaconda3/bin/conda shell.zsh hook)"

  2. 运行命令 conda initconda init <YOUR_SHELL_NAME>

    注: conda init 好像只会修改 .bashrc 文件

  3. 设置关闭自启动base环境

    1
    conda config --set auto_activate_base false

    或者修改文件 ~/.condarc

    1
    auto_activate_base: false

方法2: 全局(root)配置 (Not recommend)

以root用户进行如下操作

  1. 使用vim打开 /etc/profile, 在末尾添加

    1
    export PATH=/opt/anaconda3/bin:$PATH

    目的是为了让各用户的终端都能找到conda并运行。如果你安装在其它位置,请对应地更改目录值(下同)

  2. 运行 source /etc/profile 应用这项更改

方法3: 直接配置.bashrc或.zshrc

  1. vim ~/.bashrc

  2. 在最后一行添加:

    1
    export PATH="/opt/anaconda3/bin:$PATH"
  3. 用来激活环境变量

    1
    source ~/.bashrc
  4. 激活:

    • source activate
    • conda activate
  5. 退出激活:

    • source deactivate
    • conda deactivate

常见问题

Q: conda create 创建的目录不在 ~/.conda/envs

A: 删除 /opt/anaconda3/envs/.conda_envs_dir_test 文件

参考:

激活环境时设置环境变量

假设环境名为 env_name, 在env_name环境目录中, 创建文件夹 etc/conda/activate.d。在该文件夹下,创建 *.sh (linux/macos) 或 *.bat (windows) 文件, 将需设置的环境变量或脚本写入其中, 并通过 chmod +x *.sh 添加可执行权限. 当激活虚拟环境时, 该脚本自动运行.

分步骤如下:

  1. 在你的虚拟环境的 etc/conda/activate.d/ 目录下创建一个脚本文件

    1
    2
    3
    conda activate env_name
    mkdir -p $CONDA_PREFIX/etc/conda/activate.d
    touch $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
  2. 编辑env_vars.sh文件,添加你需要的环境变量:

    1
    2
    3
    4
    #!/bin/sh

    export MY_VAR="my_value"
    export ANOTHER_VAR="another_value"
  3. env_vars.sh 添加可执行权限:

    1
    chmod +x $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh

QAs

  1. UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\xe4’ in position 89: ordinal not in range(128)

    • 原因: 字符编码问题

    • 解决方案:

      • 方法1: 临时生效

        1. 运行命令

          1
          2
          export LANG="en_US.UTF-8"
          export LC_ALL="en_US.UTF-8"
        2. 再执行你需要执行的命令即可

      • 方法2: 当前用户永久生效

        有时 Linux 系统中编码并不能统一使用,而是只针对某用户下才使用该编码,即当使用 FineBI 的时候,在该系统用户下才能使用该编码。因此编辑配置文件时需要在该用户下编辑。

        1. 打开 ~/.bash_profile

          1
          vim ~/.bash_profile
        2. 在最后一行后面追加:

          1
          2
          export LANG="en_US.UTF-8"
          export LC_ALL="en_US.UTF-8"
        3. 重启终端或运行 source ~/.bash_profile

        注:~/.bash_profile 是每个用户都可使用该文件输入专用于自己使用的 shell 信息。

      • 方法3: 系统级对所有用户永久有效

        对整个系统都有效的修改方式,使整个系统都适应于该系统编码。该方法是在系统配置文件中添加编码方式将默认的方式覆盖掉。执行的命令如下:

        1. 打开 profile

          1
          vim /etc/profile
        2. 打开文件后在最后一行后面追加:

          1
          2
          export LANG="en_US.UTF-8"
          export LC_ALL="en_US.UTF-8"
        3. 重启终端或运行 source /etc/profile

      • 方法4: 使用 locale-gen/etc/locale.conf

        当需要生成并设置系统的默认语言环境时使用。

        1. 编辑 /etc/locale.gen,去掉 en_US.UTF-8 UTF-8 以及 zh_CN.UTF-8 UTF-8 行前的注释符号(#):

          1
          vim /etc/locale.gen
        2. 然后使用如下命令生成 locale:

          1
          locale-gen
        3. /etc/locale.conf 输入内容:

          1
          echo 'LANG=en_US.UTF-8'  > /etc/locale.conf