Conda相关操作记录

Conda虚拟环境

  1. Conda虚拟环境的基本管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# conda 虚拟环境列表
conda env list

# 创建虚拟环境
conda create -n <env_name> python=x.x

# 激活虚拟环境
conda activate <env_name>

# 退出虚拟环境
deactivate

# 删除虚拟环境
conda remove -n <env_name> --all

各个虚拟环境之间是隔离的,体现在文件夹中,每个环境都被存放在$ANACONDA_PATH/envs/<env_name>目录下。

  1. 关闭Conda base环境自动激活
1
2
3
4
5
6
7
8
# 设置auto_activate_base参数为false
conda config --set auto_activate_base false

# 需要激活base环境时
conda activate base

# 如果想要恢复自动激活base环境
conda config --set auto_activate_base true

Conda环境中配置cuda

在实际开发中,一种很常见的情况是我们的每个Conda环境对应不同的CUDA版本,例如cuda11.7、cuda11.8等等,不同的项目对应不同的cuda版本。我们希望做到是在不同Conda环境中管理相应的cuda。

Conda环境中安装相应版本的cuda

在不同Conda环境中管理相应的cuda,我们可以直接在对应Conda环境中安装对应版本的cuda即可。安装的方式就是直接通过conda install,不过具体的package分为两种。

第一种package指的是cudatoolkitcudatoolkit-dev,可以通过如下命令安装:

1
2
conda install cudatoolkit=11.1 -c conda-forge
conda install cudatoolkit-dev=11.1 -c conda-forge
  • 这种方式需要额外安装相应版本的nvcc等dev工具,即这里的cudatoolkit-dev
  • 这种方式支持cuda11.7以及之前的版本
  • 通过这种方式安装之后,对应的dev工具会被安装到Conda虚拟环境目录下的/bin中,可能需要手动export CUDA_HOME=xxx

第二种pacakge指的是cuda-toolkit,可以通过如下命令安装:

1
2
3
conda install nvidia/label/cuda-11.8.0::cuda-toolkit --channel nvidia/label/cuda-11.8.0
# or
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit
  • 注意这里需要指定channel来优先指定使用对应channel,否则可能出现的情况是只有cuda-toolkit安装了对应版本,其他关联package都在default中下载了最新版本
  • 这种方式同时包括了相应版本的nvcc等dev工具,无需额外安装。安装完成之后,可以使用which nvcc来查看具体使用的命令路径
  • 这种方式支持cuda11.3以及之后的版本,不过推荐cuda11.7以及之前使用第一种方法,cuda11.8以及之后使用第二种方法

Conda环境与cuda路径绑定

该方式相对来说不推荐,更加推荐使用第一种方法。

下面的方法适用于已经在本机的/usr/local中安装了多个版本的cuda,然后希望不同的Conda环境使用本机上不同的cuda。

如果我们在系统的.bashrc文件中指定cuda路径,那么所有的项目环境都是使用相同的cuda版本,使用起来较为不方便。于是下面介绍一种能够让每个Conda环境对应不同cuda版本的方法。

  1. 找到需要绑定cuda版本的Conda环境的目录,该目录可以通过conda env list找到
  2. 找到对应目录之后,在环境目录中找到目录etc/conda/activate.d/,该目录如果不存在,则手动创建
  3. 在该目录下创建脚本env_vars.sh,按照下面的格式输入对应内容,指定cuda版本,在例子我们指定了cuda11.8
1
2
3
#!/bin/bash
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.8/bin:$PATH
  1. 之后source .bashrc后,重新激活该环境,就可以切换版本

系统寻找要使用的cuda版本,实际上是通过path环境变量来寻找的。上面过程的原理实际上是,每次激活环境,都会执行该目录下的脚本,我们将cuda环境变量写在env_vars.sh脚本中,在每次激活环境的时候都会更新cuda路径到path环境变量,以起到绑定版本的效果。

由于原理仅是执行了一次脚本文件,所以如果在同一个shell中,我们先激活A环境(绑定了cuda版本a),退出后再次激活B环境(没有绑定cuda版本),此时B环境中使用的cuda版本仍然是a,而不是系统原先的版本,因为在这个过程中没有进行path环境变量的更新。

因此最佳实践是,如有需要的话,每个conda环境都手动绑定一个cuda版本。

同理,其他必要的path环境变量的更新也可以通过类似的操作来完成。

Jupyter配置

  1. jupyter支持Conda虚拟环境

默认情况下打开jupyter notebook是无法检测到Conda中的虚拟环境,需要进行如下配置。

1
2
3
4
5
6
# 首先在base环境下安装nb_conda_kernels 
conda install nb_conda_kernels


# 之后其他虚拟环境需要安装ipykernel才能显示在juypter的检测环境中
conda install ipykernel
  1. jupyter支持代码提示和补全

默认情况下,通过浏览器打开jupyter notebook是没有代码提示与自动补全功能的,可以参考xxx,通过安装相关插件来增加对应功能。

当然也可以通过在Pycharm中使用jupyter来解决。利用Pycharm打开.ipynb文件,其中会自带代码提示和补全的支持。

服务器安装Anaconda

在为服务器安装Anaconda的时候,我们希望在系统中仅安装一个Anaconda,同时给多用户提供服务。

  1. 首先通过root用户或者sudo权限将Anaconda安装到一个公共的目录,例如/opt。在安装完成之后不执行conda init,后续手动修改环境配置。
1
2
3
cd /opt
wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh
sudo sh Anaconda3-2023.07-2-Linux-x86_64.sh
  1. 创建用户组conda,并将Anaconda安装目录的权限都设置为该group。
1
2
3
sudo groupadd conda
sudo chgrp -R conda /opt/anaconda3
sudo chmod 770 -R /opt/anaconda3
  1. 目前仍然只有root用户可以使用Anaconda。如果新用户想要使用,则需要将其添加到conda用户组中,并修改自身home目录下的环境配置。
1
sudo usermod -a -G conda <user-account>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
. "/opt/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/opt/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<

Jupyter Lab相关配置

在服务器上安装了Anaconda之后,base环境中自带了Jupyter Lab,我们可以启动服务器上的Jupyter Lab,并将其转发到本机的端口上,实现通过本地浏览器进行访问。

  1. 生成配置文件

jupyter lab配置文件默认位于~/.jupyter/jupyter_notebook_config.py,如果没有该文件,可以通过下面的命令生成:

1
jupyter notebook --generate-config
  1. 修改登录密码

首先进入python交互式环境,通过下面方式生成密码:

1
2
from notebook.auth import passwd
passwd()

根据提示进行密码设置,得到对应的hash表示。之后将该hash表示配置在jupyter lab配置文件中:

1
c.NotebookApp.password = 'your_password_hash_here'
  1. 修改启动端口。启动端口的修改只需要修改配置文件即可
1
c.ServerApp.port = 9999  # Change to your desired port number
  1. 之后我们可以在本地启动jupyter lab。可以通过命令行直接启动,这里提供一个参考脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash

# Set the path to your JupyterLab directory
JUPYTERLAB_DIR="/your/jupyter/lab/work/directory"
ANACONDA_DIR="/opt"
LOG_DIR="/your/log/directory"

start_jupyterlab() {
echo "Starting JupyterLab..."
cd "$JUPYTERLAB_DIR"
source $ANACONDA_DIR/anaconda3/bin/activate base
nohup jupyter lab > $LOG_DIR/logs/jupyter-running-log.log 2>&1 &
echo "JupyterLab started."
}

stop_jupyterlab() {
echo "Stopping JupyterLab..."
pkill -f "jupyter-lab"
echo "JupyterLab stopped."
}

view_log() {
local num_lines=${1:-20} # Default to 20 lines if not specified
echo "Viewing last $num_lines lines of JupyterLab log..."
tail -n "$num_lines" "$LOG_DIR/logs/jupyter-running-log.log"
}

case "$1" in
start)
start_jupyterlab
;;
stop)
stop_jupyterlab
;;
restart)
stop_jupyterlab
start_jupyterlab
;;
log)
view_log "$2" # Pass the parameter to view_log function
;;
*)
echo "Usage: $0 {start|stop|restart|log} [num_lines]"
exit 1
;;
esac

exit 0
  1. 启动之后,可以通过ssh端口转发,然后在本地通过浏览器访问localhost来进入jupyter lab。注意这里端口要与上面修改的port相对应。
1
ssh -N -L 9999:localhost:8888 username@remote_server_ip

参考文章

  1. anaconda 取消每次默认启动base环境_mob604756fa6ad7的技术博客
  2. 如何在 Jupyter Notebook 中切换/使用 conda 虚拟环境?_jupyter notebook conda env_Tina姐的博客-CSDN博客
  3. Anaconda 多用户安装 51CTO博客 ubuntu 安装anaconda
  4. 不同conda环境切换不同的cuda版本_conda 切换cuda-CSDN博客
  5. Conda安装cuda指定版本遇到的一个大坑,导致pytorch无法使用cuda且nvcc -V显示错误的cuda版本_conda虚拟环境cuda不能用-CSDN博客

Conda相关操作记录
http://example.com/2023/08/05/Conda相关操作记录/
作者
EverNorif
发布于
2023年8月5日
许可协议