本文最后更新于:2024-09-09T20:14:17+08:00
Conda虚拟环境
Conda虚拟环境的基本管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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>目录下。
关闭Conda base环境自动激活
1 2 3 4 5 6 7 8 conda config --set auto_activate_base false conda activate 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指的是cudatoolkit 和cudatoolkit-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 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版本的方法。
找到需要绑定cuda版本的Conda环境的目录,该目录可以通过conda env list找到
找到对应目录之后,在环境目录中找到目录etc/conda/activate.d/,该目录如果不存在,则手动创建
在该目录下创建脚本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
之后source .bashrc后,重新激活该环境,就可以切换版本
系统寻找要使用的cuda版本,实际上是通过path环境变量来寻找的。上面过程的原理实际上是,每次激活环境,都会执行该目录下的脚本,我们将cuda环境变量写在env_vars.sh脚本中,在每次激活环境的时候都会更新cuda路径到path环境变量,以起到绑定版本的效果。
由于原理仅是执行了一次脚本文件,所以如果在同一个shell中,我们先激活A环境(绑定了cuda版本a),退出后再次激活B环境(没有绑定cuda版本),此时B环境中使用的cuda版本仍然是a,而不是系统原先的版本,因为在这个过程中没有进行path环境变量的更新。
因此最佳实践是,如有需要的话,每个conda环境都手动绑定一个cuda版本。
同理,其他必要的path环境变量的更新也可以通过类似的操作来完成。
Jupyter配置
jupyter支持Conda虚拟环境
默认情况下打开jupyter
notebook是无法检测到Conda中的虚拟环境,需要进行如下配置。
1 2 3 4 5 6 conda install nb_conda_kernels conda install ipykernel
jupyter支持代码提示和补全
默认情况下,通过浏览器打开jupyter
notebook是没有代码提示与自动补全功能的,可以参考xxx,通过安装相关插件来增加对应功能。
当然也可以通过在Pycharm中使用jupyter来解决。利用Pycharm打开.ipynb文件,其中会自带代码提示和补全的支持。
服务器安装Anaconda
在为服务器安装Anaconda的时候,我们希望在系统中仅安装一个Anaconda,同时给多用户提供服务。
首先通过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
创建用户组conda,并将Anaconda安装目录的权限都设置为该group。
1 2 3 sudo groupadd conda sudo chgrp -R conda /opt/anaconda3 sudo chmod 770 -R /opt/anaconda3
目前仍然只有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_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
Jupyter Lab相关配置
在服务器上安装了Anaconda之后,base环境中自带了Jupyter
Lab,我们可以启动服务器上的Jupyter
Lab,并将其转发到本机的端口上,实现通过本地浏览器进行访问。
生成配置文件
jupyter
lab配置文件默认位于~/.jupyter/jupyter_notebook_config.py,如果没有该文件,可以通过下面的命令生成:
1 jupyter notebook --generate-config
修改登录密码
首先进入python交互式环境,通过下面方式生成密码:
1 2 from notebook.auth import passwd passwd()
根据提示进行密码设置,得到对应的hash表示。之后将该hash表示配置在jupyter
lab配置文件中:
1 c.NotebookApp.password = 'your_password_hash_here'
修改启动端口。启动端口的修改只需要修改配置文件即可
之后我们可以在本地启动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 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} 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 " ;; *) echo "Usage: $0 {start|stop|restart|log} [num_lines]" exit 1 ;;esac exit 0
启动之后,可以通过ssh端口转发,然后在本地通过浏览器访问localhost来进入jupyter
lab。注意这里端口要与上面修改的port相对应。
1 ssh -N -L 9999:localhost:8888 username@remote_server_ip
参考文章
anaconda
取消每次默认启动base环境_mob604756fa6ad7的技术博客
如何在
Jupyter Notebook 中切换/使用 conda 虚拟环境?_jupyter notebook conda
env_Tina姐的博客-CSDN博客
Anaconda
多用户安装 51CTO博客 ubuntu 安装anaconda
不同conda环境切换不同的cuda版本_conda
切换cuda-CSDN博客
Conda安装cuda指定版本遇到的一个大坑,导致pytorch无法使用cuda且nvcc
-V显示错误的cuda版本_conda虚拟环境cuda不能用-CSDN博客