使用CodeWithGPU实现模型的开箱即用


CodeWithGPU简介

CodeWithGPU是一个AI镜像、模型技术社区(今后文档中简称CG),它以GitHub为基础,在GitHub托管的代码下游,提供额外的镜像环境、算法模型等,解决以往构建环境难、管理与分享模型难的问题,为算法开发者、研究者等提供开箱即用的内容体验。 >CodeWithGPU和AutoDL同属于视拓云研发和运营的产品,两者账户通用,可以互相登录使用。 ### 镜像 CG上的镜像指能运行Github上某一具体项目代码所需的docker image环境。主要目的为方便其他用户免去构建环境安装依赖的过程,而直接在此基础之上训练模型。镜像来自用户在AutoDL上保存的docker image。(AutoDL是一个GPU算力租用平台,它和CG共用账户,即一个帐号可在两个平台中登录)

模型

CG上的模型指用户使用算法在某数据集上训练出来的模型文件。 使用的话首先需要安装:pip install codewithgpu 可以由以下两种方式下载模型: 1. cli

cg down GuoFeng3/GuoFeng3.3.safetensors
2. 代码中集成
import codewithgpu as cg 
cg.model.download("模型文件的KEY", target_directory="下载目标路径,可选"))

安装

cuda检查

检查电脑的nvidia驱动以及cuda toolkit。

nvidia-smi
nvcc -V
如果显示有:Failed to initialize NVML: Driver/library version mismatch。则说明驱动和cuda toolkit版本不匹配,需要重新安装驱动或者cuda toolkit。

或者你的cuda版本过低,建议也升级一下,不然CG很多新的镜像都无法使用。

如果你的cuda版本ok且驱动都正常的话,那么跳过这里直接看下面的安装cg-client。

卸载旧版本nvida驱动和cuda toolkit

  • 卸载nvidia驱动:sudo nvidia-uninstall

  • 卸载cuda toolkit:找到 CUDA 工具包的安装目录(例如 /usr/local/cuda-10.1/),然后执行:

    cd /usr/local/cuda-10.1/bin/
    sudo ./cuda-uninstaller
    如果你忘记了 CUDA 工具包的安装目录,可以使用以下命令找到:
    where nvcc
    或者通过之前安装cuda设置的环境变量查看:
    echo $PATH | tr ':' '\n' | grep cuda
    echo $LD_LIBRARY_PATH | tr ':' '\n' | grep cuda
    如果没有找到cuda-uninstaller,可以手动删除:
    sudo rm -rf /usr/local/cuda-11.8/   # 删除目录
    # 清理其他残留文件:
    sudo apt-get remove --purge '^nvidia-.*'
    sudo apt-get remove cuda*
    sudo apt-get autoremove
    
    # 查看剩余残留
    sudo dpkg -l |grep cuda
    
    # 继续卸载哈哈
    sudo dpkg -P 残留文件全称
    
    # 环境变量删除:编辑~/.bashrc 或者  /etc/profile文件中是否有 CUDA 相关路径, 删除以下内容
    export PATH=/usr/local/cuda-11.8/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
    # 保存
    source ~/.bashrc
    

  • 完成卸载后,删除 CUDA 工具包的目录:

    sudo rm -rf /usr/local/cuda-10.1/
    ### 安装新版本nvidia驱动

  • 前往 NVIDIA 官方网站,根据显卡型号(例如 2080Ti)下载最新的驱动程序。

  • 将下载的驱动程序(例如 NVIDIA-Linux-x86_64-550.54.14.run)上传到服务器的某个目录,然后执行:

    sudo sh NVIDIA-Linux-x86_64-550.54.14.run

  • 安装完成后,重启服务器:

    sudo reboot

  • 重启后,检查驱动是否安装成功:

    nvidia-smi

安装新版本cuda toolkit

注意安装的cuda toolkit版本要和nvidia驱动版本匹配:

- nvidia-smi属于driver API、nvcc属于runtime API。
- 用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。
- 用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。
- 如果只安装driver API,不安装runtime API(cuda toolkit),也能正常使用pytorch,但涉及到一些需要编译安装的更底层的工具,比如apex、deepspeed,就会报错,这时还需要床runtime API。
- 前往 NVIDIA 开发者网站,根据操作系统和需求下载与新驱动兼容的 CUDA 工具包(例如 CUDA 12.1.1)。 - 将下载的 CUDA 安装包(例如 cuda_12.1.1_530.30.02_linux.run)上传到服务器的某个目录,然后执行:
sudo sh cuda_12.1.1_530.30.02_linux.run
注意:由于已经有CUDA Driver12.4了,因此在安装过程中不需要勾选CUDA Driver。 - 安装完成后,设置环境变量: (如果之前安装过旧版本记得删除旧版本的环境变量)
echo 'export PATH=/usr/local/cuda-12.1/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
- 检查CUDA是否安装成功:
nvcc -V

cg-client

# 下载客户端并添加可执行权限
wget -O cg-client https://codewithgpu.ks3-cn-beijing.ksyuncs.com/cg-client
chmod +x cg-client

# 启动客户端,需要使用到sudo权限否则有docker使用上的异常
sudo ./cg-client

web上使用

启动cg-client后会输出类似如下包含访问地址的日志:

**************

cg-client is running on http://localhost:2022/container?token=E5PR11vT9MMbrpwFeIdLcltRNnUmaY

**************
在浏览器中打开该地址后,客户端会自动检测是否有Docker环境,点击安装nvidia-docker按钮自动安装相关环境

docker的权限配置

在使用docker时,如果不想每次都使用sudo,可以将当前用户加入docker组:

sudo groupadd docker # 添加docker组
sudo gpasswd -a ${USER} docker # 将当前用户加入docker组
sudo systemctl restart docker # 重启docker服务

sudo chmod a+rw /var/run/docker.sock # 修改docker.sock权限

如果使用ssh连接的服务器使用则需要设置端口转发

ssh -CNg -L 2022:localhost:2022 user@host -p port
参数说明: -C: 启用压缩。这对于减少传输数据量有帮助,特别是在带宽较低的情况下。

-N: 不执行远程命令,只建立隧道。适合仅用于端口转发的场景。

-g: 允许其他主机通过本机(运行此命令的机器)的 7890 端口访问隧道。 如果不需要其他机器访问,可以省略这个参数。

-L: 本地端口转发。格式为 -L [本地端口]:[目标地址]:[目标端口]

CG开始使用时需要安装docker/nvidia-docker环境,web界面会自动检测是否有Docker环境,点击安装nvidia-docker按钮自动安装相关环境,但是我使用时发现我原本安装的docker环境在使用CG提供的脚本安装后就失效了,所以建议还是卸载原有的docker环境后再使用CG提供的脚本安装

这样就成功啦

使用

在web界面可以实现容器的创建、启动、停止、删除等操作,也可以上传文件到容器中,也可以在容器中打开终端,执行命令,查看日志等操作。

docker的存储

在容器内我们会发现系统盘大小为本地根目录的大小,这是因为Docker 默认安装的情况下,会使用/var/lib/docker/目录作为存储目录,用以存放拉取的镜像和创建的容器等。

而autodl-tmp未挂载,虽然CG提供了网盘的支持,但是如果我们想适用宿主机中的磁盘分区的话,还得会一些docker的存储知识(见博客-docker的存储

在了解了docker的存储后,我们可以通过docker run命令的-v参数来挂载宿主机的磁盘分区到容器中,这样就可以在容器中使用宿主机的磁盘分区了。在web界面创建容器时也提供了挂载的选项,可以直接在web界面中挂载。

镜像与容器的基本用法

具体见博客-docker的常见命令,这里简单通过本地终端创建并运行一个容器来说明: - 拉取镜像

docker pull registry.cn-beijing.aliyuncs.com/codewithgpu2/hvision-nku-storydiffusion:n3iFx8w7UJ
- 查看镜像
docker images
- 创建并运行容器
sudo docker run -d --name quizzical_wilson --gpus all -v data80:/root/autodl-tmp registry.cn-beijing.aliyuncs.com/codewithgpu2/hvision-nku-storydiffusion:n3iFx8w7UJ sleep infinity
# 这里我挂载了一个卷data80到容器的/root/autodl-tmp目录

sudo docker exec -it quizzical_wilson /bin/bash
到这里就可以在容器中进行操作了,可以使用exit退出容器。 - 停止容器
docker stop quizzical_wilson

参考: > CG官方文档:https://www.codewithgpu.com/docs/

docker engine文档:https://docs.docker.com/engine/


文章作者: 庞贝堡垒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 庞贝堡垒 !
评论
  目录