当前位置: 首页 > news >正文

使用Docker配置深度学习的运行环境

文章目录

  • 推荐
  • 实验环境
  • 前言
  • docker安装
  • docker操作
  • docker配置
    • 常见方法(安装包、联网、程序管理器)安装驱动的前提要求
    • 传统方法安装驱动程序
      • 程序管理器安装
      • 联网安装
      • deb包安装
    • 安装完成后的设置
    • 非传统方法安装-通过容器安装驱动的前提要求
      • 安装NVIDIA-Container-Toolkit应用程序的前提要求
      • 安装NVIDIA-Container-Toolkit应用程序
    • 非传统方法-通过容器安装驱动
    • 反复报错
    • 之前反复重装时卸载步骤
  • 最终结果

推荐

  1. 在linux系统中进行操作,最重要的就是意识到用户权限,这在通过不同方式安装不同应用中非常重要,不然你就会导致一些用户无法使用。
  2. 除了用户权限的问题还有就是程序的安装位置,不同的安装位置的程序的启动方式是不同的,安装在/usr/local/bin目录下的程序,如果启动文件是在这个目录下,在任意位置都可以直接启动,如果启动文件是在子目录下,需要链接一下才能在任意位置启动。在其他位置则需要连接一下才能在任意位置使用。
  3. 如果一些应用是希望开机自启动的,类似于下面的alist,就需要编辑守护进程,这样系统在启动的时候会自动调用守护进程。

建议在尝试Linux之前首先参考一下相关文献:

  • Ubuntu:Install Ubuntu desktop
  • Linux 101:软件安装与文件操作
  • 码农教程:Linux操作系统查看系统信息

实验环境

参考:

  • PHP中文网:linux如何查看版本信息
  • 阿里云:ubuntu查看硬件信息

查看系统信息的指令:

cat /proc/version
uname -a
sudo lshw
gnome-shell --version
项目内容
系统Ubuntu 22.04(jammy)
内存12GiB
处理器Intel® Core™ i5-6300HQ CPU @ 2.30GHz × 4
图形Intel® HD Graphics 530 & GM107M [GeForce GTX 960M]
GNOMEGNOME Shell 42.9
操作系统类型64位
磁盘128GB

前言

在进行科研工作时,很多时候都需要对代码进行复现。复现很简单,问题的难点在于环境的配置,环境配置好了,实验自然就能够复现,环境配置错误,往往会不停报错。因此为了省去配置环境的麻烦,我们选择把环境连同系统一起打包,即采用docker,实现快速可迁移的代码复现。

docker安装

在电脑上安装Docker,切记安装的是Docker engine!!!Docker desktop-小孩子的玩具,狗都不用(里面功能有缺陷,无法挂载GPU,还要配合engine使用才行,官网说desktop包含engine,狗屁!害我装了好几遍desktop配置)!!!,安装Docker engine参见官网教程。
问题安装好以后docker帮助命令如下所示。

docker -h
Flag shorthand -h has been deprecated, please use --helpUsage:  docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run         Create and run a new container from an imageexec        Execute a command in a running containerps          List containersbuild       Build an image from a Dockerfilepull        Download an image from a registrypush        Upload an image to a registryimages      List imageslogin       Log in to a registrylogout      Log out from a registrysearch      Search Docker Hub for imagesversion     Show the Docker version informationinfo        Display system-wide informationManagement Commands:builder     Manage buildsbuildx*     Docker Buildx (Docker Inc., v0.11.0)compose*    Docker Compose (Docker Inc., v2.19.1)container   Manage containerscontext     Manage contextsdev*        Docker Dev Environments (Docker Inc., v0.1.0)extension*  Manages Docker extensions (Docker Inc., v0.2.20)image       Manage imagesinit*       Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.6)manifest    Manage Docker image manifests and manifest listsnetwork     Manage networksplugin      Manage pluginssbom*       View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)scan*       Docker Scan (Docker Inc., v0.26.0)scout*      Command line tool for Docker Scout (Docker Inc., 0.16.1)system      Manage Dockertrust       Manage trust on Docker imagesvolume      Manage volumesSwarm Commands:swarm       Manage SwarmCommands:attach      Attach local standard input, output, and error streams to a running containercommit      Create a new image from a container's changescp          Copy files/folders between a container and the local filesystemcreate      Create a new containerdiff        Inspect changes to files or directories on a container's filesystemevents      Get real time events from the serverexport      Export a container's filesystem as a tar archivehistory     Show the history of an imageimport      Import the contents from a tarball to create a filesystem imageinspect     Return low-level information on Docker objectskill        Kill one or more running containersload        Load an image from a tar archive or STDINlogs        Fetch the logs of a containerpause       Pause all processes within one or more containersport        List port mappings or a specific mapping for the containerrename      Rename a containerrestart     Restart one or more containersrm          Remove one or more containersrmi         Remove one or more imagessave        Save one or more images to a tar archive (streamed to STDOUT by default)start       Start one or more stopped containersstats       Display a live stream of container(s) resource usage statisticsstop        Stop one or more running containerstag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop         Display the running processes of a containerunpause     Unpause all processes within one or more containersupdate      Update configuration of one or more containerswait        Block until one or more containers stop, then print their exit codesGlobal Options:--config string      Location of client config files (default"/home/stu/.docker")-c, --context string     Name of the context to use to connect to thedaemon (overrides DOCKER_HOST env var anddefault context set with "docker context use")-D, --debug              Enable debug mode-H, --host list          Daemon socket to connect to-l, --log-level string   Set the logging level ("debug", "info","warn", "error", "fatal") (default "info")--tls                Use TLS; implied by --tlsverify--tlscacert string   Trust certs signed only by this CA (default"/home/stu/.docker/ca.pem")--tlscert string     Path to TLS certificate file (default"/home/stu/.docker/cert.pem")--tlskey string      Path to TLS key file (default"/home/stu/.docker/key.pem")--tlsverify          Use TLS and verify the remote-v, --version            Print version information and quitRun 'docker COMMAND --help' for more information on a command.For more help on how to use Docker, head to https://docs.docker.com/go/guides/

docker操作

参考:

  • 菜鸟教程:Docker教程
#查看本地镜像
docker images 
名字属性
REPOSITORY表示镜像的仓库源
TAG镜像的标签
IMAGE ID镜像ID
CREATED镜像创建时间
SIZE镜像大小
#查看所有容器
docker ps -a
名字属性
CONTAINER ID:容器 ID。
IMAGE使用的镜像。
COMMAND启动容器时运行的命令。
CREATED容器的创建时间。
STATUS容器状态。
PORTS容器的端口信息和使用的连接类型(tcp\udp)。
NAMES自动分配的容器名称。

常见操作指令如下所示:

#拉取镜像
docker pull
#运行镜像为容器
docker run -it ubuntu /bin/bash
#退出终端
exit
#启动容器
docker start 1e560fca3906
#进入容器
docker exec 1e560fca3906
#停止容器
docker stop 1e560fca3906
#重启容器
docker restart 1e560fca3906
#导出容器
docker export 1e560fca3906 > ubuntu.tar
#导入容器
docker import ubuntu.tar test/ubuntu:v1
#删除容器
docker rm -f 1e560fca3906

docker配置

1. 启动的容器要想正常使用还需要安装一些软件
比如要想让启动的容器可以通过ssh连接进行访问,就需要在容器中安装ssh服务。当我们需要在云服务器中安装docker容器又想要在外部可以直接访问这个容器而不是先登录服务器然后再打开docker容器,我们可以把docker容器的ssh端口映射到服务器的某个端口上,这样我们可以通过ssh直接访问内部的docker容器。
参考:

  • 知乎:OpenSSH安装与使用-Linux
  • 腾讯云开发者社区:ubuntu系统启用root用户远程登陆
  • SegmentFault:VsCode轻松使用docker容器-Remote Containers
  • 菜鸟教程:容器互联
#在容器内安装ssh方便通过ssh访问容器
apt install ssh
----------------------------------------------------------------------------------------
#在容器内添加用户密码方便通过ssh登陆时访问
passwd root
123
----------------------------------------------------------------------------------------
#容器内设置端口映射,将容器端口22映射到宿主机的某个端口
/etc/init.d/ssh start         %启动ssh
/etc/init.d/ssh stop          %关闭ssh
/etc/init.d/ssh restart       %重启ssh
----------------------------------------------------------------------------------------
#容器内修改配置文件,允许用户通过密码登陆root用户
/etc/ssh/sshd_config
PermitRootLogin yes
----------------------------------------------------------------------------------------
#其它主机通过ssh连接容器
ssh -p port user@ip
123

2. 在实现远程登录以后要想用于深度学习人工智能开发还需要安装pytorch。
在实现容器能够通过ssh连接以后要想用于深度学习开发还需要配置好深度学习环境。
Prompt:服务器深度学习环境配置?
参考:

  • CSDN:深度学习服务器环境配置总结
  • 知乎:给Linux服务器配置深度学习环境
  • 腾讯云:cuda卸载与安装
  • CSDN:实现Linux服务器配置深度学习环境并跑代码完整步骤

上述最后一个参考还是有可取之处的,虽然不是很正确。

深度学习服务器比较好的管理方式是采用分配账户的方式来提高服务器的利用率。其中cuda最好是通过全局的方式安装到机器上的,也就是所有用户都可以访问,nvidia驱动和cudnn是直接安装在全局上的,这个没什么疑问。Anaconda和pytorch/tensorflow是需要每个用户自行安装的,每个用户根据自己不同的需要安装不同的包。

#安装相应的pytorch版本
pip3 install torch torchvision torchaudio

3. 安装pytorch之前还需要检查一下看能不能使用宿主机的显卡。不然的话就没办法进行深度学习人工智能训练。

Prompt:怎么让容器能够访问宿主机的GPU显卡?
参考:

  • 稀土掘金:ubuntu如何查看硬件信息
  • CSDN:linux(ubuntu)查看硬件设备命令
#查看硬件设备信息
sudo lshw
sudo lshw -C display
#如果找不到此命令就安装:apt install lshw
%系统
# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本 
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名 
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备 
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量
%资源
# free -m                # 查看内存使用量和交换区使用量 
# df -h                  # 查看各分区使用情况 
# du -sh <目录名>        # 查看指定目录的大小 
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载 
# cat /proc/loadavg      # 查看系统负载
%磁盘和分区
# mount | column -t      # 查看挂接的分区状态 
# fdisk -l               # 查看所有分区 
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备) 
# dmesg | grep IDE       # 查看启动时IDE设备检测状况
%网络
# ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置 
# route -n               # 查看路由表 
# netstat -lntp          # 查看所有监听端口 
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息
%进程
# ps -ef                 # 查看所有进程 
# top                    # 实时显示进程状态
%用户
# w                      # 查看活动用户 
# id <用户名>            # 查看指定用户信息 
# last                   # 查看用户登录日志 
# cut -d: -f1 /etc/passwd   # 查看系统所有用户 
# cut -d: -f1 /etc/group    # 查看系统所有组 
# crontab -l             # 查看当前用户的计划任务
%服务
# chkconfig --list       # 列出所有系统服务 
# chkconfig --list | grep on    # 列出所有启动的系统服务
%程序
# rpm -qa                # 查看所有安装的软件包

经过检查发现,这个容器无法识别宿主机的显卡,所以也就没办法运行深度学习,我们需要手动把GPU挂载上去才可以。
4. 怎么把宿主机的GPU显卡挂载到容器上?
Prompt:ubuntu服务器怎么挂载GPU到docker中?
要想让容器能够使用GPU,还需要安装container-toolkit,但是问题在于toolkit安装在哪里?安装在容器中还是宿主机中?感觉应该是安装在宿主机中。
在官方指导中,可以通过官网下载安装包安装,也可以通过在线联网安装,也可以通过系统自带的程序管理器也就是additional driver应用程序来安装,还可以把驱动程序安装在容器中,这样容器方便迁移,驱动也就方便迁移。还真有人把驱动放进容器中,这也太神奇了。

常见方法(安装包、联网、程序管理器)安装驱动的前提要求

在使用上述常见方法安装显卡驱动时,有一些前提要求。前提要求是否满足可以参考以下官方链接进行检查

  • NVIDIA:Pre-installation Actions
  • 腾讯云:linux查看内核版本_ubuntu查看内核版本号
  • 博客园:ubuntu—查看、安装、切换内核
  • CSDN:ubuntu16查看\下载\切换内核

主要检查的就是有没有显卡,gcc是否安装,以及内核版本和内核头部是否匹配。如果不匹配要安装相应的内核头部。因为有了匹配的内核头部,安装应用程序的时候才能正常通过校验。验证指令如下所示:

#查看GPU是否可以用nvidia的驱动及cuda
lspci | grep -i nvidia
#检查系统版本
uname -m && cat /etc/*release
#检查gcc是否安装了
gcc --version
#查看内核版本
lsb_release -a
uname -a
hostnamectl
cat /proc/version
cat /etc/issue
lsb_release -a
#查看内核头文件的版本
dpkg --get-selections | grep linux 或者 dpkg --list |grep linux
#linux-image-版本号:内核映像文件
#linux-headers-版本号:内核头文件
#linux-image-extra-版本号:内核扩展文件
#最后一步比较复杂,就是要检查内核头文件版本和内核版本是否对应。如果不对应,需要进行修改,

当内核版本跟内核头部文件不匹配时,需要安装相应的内核版本。并修改配置文件使得按照要求的内核运行。

#安装内核版本
sudo apt install linux-image-版本号-generic
#查看配置文件中的内核启动顺序
grep menuentry /boot/grub/grub.cfg
#修改配置文件设置内核启动顺序
sudo gedit /etc/default/grub
#把GRUB_DEFAULT=0修改为 GRUB_DEFAULT=”Ubuntu,Linux 4.4.0-21-generic“ 这种类型的, 当然内核版本应该是你想要的.
#修改完成后更新使生效
sudo update-grub
#再修改配置文件
sudo gedit /boot/grub/grub.cfg
#大概在148行有个........,把版本号改为你需要的版本号,修改好以后保存退出.
#然后重启电脑
#检验是否安装成功
uname -r

当上述要求满足以后就可以按照常见方法中给定的安装步骤进行安装驱动程序。

传统方法安装驱动程序

下述方法进行之前最好检查以上前提要求是否满足!
安装显卡driver的方法参考:

  • NVIDIA:NVIDIA Driver Installation Quickstart Guide
  • myfreax:如何在 Ubuntu 20.04 安装 Nvidia 驱动程序

程序管理器安装

首先是最简单的通过additional driver安装驱动。对于Ubuntu系统来说,如果你的计算机有NVIDIA GPU,那么系统会自动安装开源驱动程序 Nouveau 和 NVIDIA专有驱动程序,你可以自己选择,通过桌面上的附加驱动(一块电路板图标)来更改使用的驱动。
默认情况下,Ubuntu 使用的 Nouveau 驱动程序通常比专有驱动程序慢得多,并且不支持最新的硬件和软件技术。所以通过additional driver可以更改GPU使用的驱动程序。
这种方法安装的驱动程序跟通过命令行安装的具有同样效力。通过命令行安装驱动如下所示:

#检查有什么驱动及对应的驱动程序
ubuntu-drivers devices
#安装想使用的版本的驱动
sudo apt install nvidia-driver-版本号
#当然这样安装的是ubuntu软件源默认提供的驱动程序,如果想使用最新的驱动程序,可以从NVIDIA官网上导入PPA来安装。
#重启使生效
sudo reboot
#检查安装情况
nvidia-smi

联网安装

BASE_URL=https://us.download.nvidia.com/tesla
DRIVER_VERSION=450.80.02
curl -fSsl -O $BASE_URL/$DRIVER_VERSION/NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
sudo sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run

deb包安装

sudo apt-get install linux-headers-$(uname -r)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-drivers
#下载好deb安装包后进行安装
sudo dpkg -i *.deb

安装完成后的设置

安装完成后还有一些设置需要完成,包括设置环境变量等,参考:

  • NVIDIA:Post-installation Actions

不过在使用deb包安装nvidia驱动时,deb包里面包含了配置环境变量的脚本,所以会自动进行环境变量配置,其他的安装方式我还不知道。

非传统方法安装-通过容器安装驱动的前提要求

在系统中安装容器版本的驱动程序,参考:

  • NVIDIA:NVIDIA Driver Containers

安装容器版本的驱动程序也有一定的要求,包括禁用开源驱动程序,GPU架构,container toolkit的设置,内核模块的开启等,具体检查方法,如下所示:

#禁用Nouveau,启用IPMI
Prompt:ubuntu如何禁用Nouveau?
## 禁用Nouveau
sudo tee /etc/modules-load.d/ipmi.conf <<< "ipmi_msghandler" \
&& sudo tee /etc/modprobe.d/blacklist-nouveau.conf <<< "blacklist nouveau" \
&& sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf <<< "options nouveau modeset=0"
----------------------------------------------------------------------------------------
#查看GPU架构>Fermi(2.1)
## 安装查看GPU的工具
sudo apt install gpustat
##查看GPU的状态、温度、功率、显存使用情况
gpustat
----------------------------------------------------------------------------------------
#设置NVIDIA Container Toolkit for docker为root权限级别,
##根据官方文档中的意思就是:
##先安装好container toolkit,然后修改里面的配置,使得当启动容器时,导入的GPU驱动指向的是驱动容器内的驱动。
##所以container toolkit程序的作用就是设置:当启动容器并挂载GPU时,对应的GPU驱动程序去哪里找?通过修改container toolkit的配置文件可以修改驱动程序的位置,进而让挂载GPU时有不同的位置设置。
##所以我用常见方法安装好驱动以后,要想在容器中使用GPU,也需要下载container toolkit来指定容器去哪里找驱动程序,否则容器无法使用驱动程序。
##设置container toolkit应用程序的权限
sudo sed -i 's/^#root/root/' /etc/nvidia-container-runtime/config.toml
----------------------------------------------------------------------------------------
#启用i2c_core内核模块
## 如果是aws核,需要启用此模块,其他的版本就不用了
sudo tee /etc/modules-load.d/ipmi.conf <<< "i2c_core"
----------------------------------------------------------------------------------------
# 更新使得配置生效
sudo apt-get dist-upgrade
sudo update-initramfs -u
# 重启生效
sudo reboot

即安装驱动容器之前要先安装好NVIDIA-Container-Toolkit,安装NVIDIA-Container-Toolkit可以参考:

  • NVIDIA:Installation Guide

安装NVIDIA-Container-Toolkit应用程序的前提要求

参考:

  • NVIDIA:Installation Guide

安装这个应用程序也有前提要求,包括要先安装NVIDIA驱动程序,以及其他要求,如下所示:

#kernel version > 3.10
uname -a
----------------------------------------------------------------------------------------
#Docker >=19.03
docker -v
----------------------------------------------------------------------------------------
#GPU architecture >=Kepler
gpustat
----------------------------------------------------------------------------------------
#NVIDIA driver >=418.81.07
nvidia-smi

除了这些前提要求以外,官网还提到了CDI,但是介绍不是很详细,可以参考:
Github:CDI - The Container Device Interface
官网上的意思好像是说,安装好这个NVIDIA-Container-Toolkit以后,可以用于Container Device Interface (CDI) Support,也可以用于Docker;Docker的安装参考:Docker:Docker install,Docker安装好以后,我们可以在宿主机上安装NVIDIA-Container-Toolkit,从而让docker的容器可以使用GPU。

安装NVIDIA-Container-Toolkit应用程序

参考:

  • NVIDIA:Installation Guide
  • 简书:在docker容器中使用tensorflow-gpu
  • CSDN:linux中在docker container中使用宿主机的GPU资源
#设置gpg-key
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
#更新及安装
sudo apt-get update            
sudo apt-get install -y nvidia-container-toolkit
#配置container-toolkit的守护进程
sudo nvidia-ctk runtime configure --runtime=docker
##上述命令不太行,我们修改一下
sudo dockerd --add-runtime=nvidia=/usr/bin/nvidia-container-runtime [...]
##或者
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
EOF
sudo systemctl daemon-reload \&& sudo systemctl restart docker
#重启docker
sudo systemctl restart docker
Failed to restart docker.service: Unit docker.service is masked.
#通过运行基本的CUDA容器来验证工作设置
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
#要想使用vscode连接容器,需要安装三个插件
Docker #Makes it easy to create, manage, and debug containe
Remote - ssh #Open any folder on a remote machine using SSH and
Dev containers #Open any folder or repository inside a Docker contai
##这样在启动容器以后就可以通过右键容器选择“attach visual studio code”来连接容器
----------------------------------------------------------------------------------------
#通过vscode连接远程服务器并将上述三个拓展也安装到服务器上
##如果访问不了docker就是用户权限问题
sudo gpasswd -a <当前登陆用户名> docker
### 例如: sudo gpasswd -a xuxiaocong docker
### 从用户组中删除: sudo gpasswd -d <当前登陆用户名> docker
##链接上以后,再添加三个拓展,然后再重启就可以使用docker了
sudo reboot
----------------------------------------------------------------------------------------
#当配置好上述设置以后每次登陆还需要输入密码为了省略上述操作我们可以生成ssh-key,然后把公钥上传到远程服务器的
##/home/hph/.ssh/authorized_keys中
----------------------------------------------------------------------------------------
#怎么把宿主机的GPU显卡挂载到容器中?
#要想把宿主机的GPU挂载到容器中,需要在宿主机中安装一个NVIDIA-Container-toolkit组件
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
#安装好以后将GPU挂载到容器中的命令就是:
sudo docker run -e NVIDIA_VISIBLE_DEVICES=all nvidia/cuda:10.0-base nvidia-smi

命令执行过程中如下图所示:
第一步
第二步
第三步
第四步
第五步
第六步
参考:

  • CSDN:docker: Error response from daemon: Unknown runtime specified nvidia.

上面反复错误就是因为我用的是Docker desktop,导致缺少docker.service文件,连systemctl都找不到docker.service在哪里,更开不了守护进程daemon。

如果还有问题可以参考:

  • 简书:在docker容器中使用tensorflow-gpu
  • CSDN:ubuntu20.04下安装Docker和NVIDIA Container Toolkit教程
  • 稀土掘金:安装NVIDIA Container Toolkit

非传统方法-通过容器安装驱动

在满足上面提到的要求以后,我们可以启动一个驱动容器,也就是专门用来运行驱动程序的容器,

#启动此驱动容器
sudo docker run --name nvidia-driver -d --privileged --pid=host \
-v /run/nvidia:/run/nvidia:shared \
-v /var/log:/var/log \
--restart=unless-stopped \
nvidia/driver:450.80.02-ubuntu18.04
----------------------------------------------------------------------------------------
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done#在驱动容器启动完成后,我们就可以在深度学习容器中挂载GPU了
sudo docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
sudo docker run --gpus all nvidia/cuda:11.8.0-devel-ubuntu22.04 nvidia-smi
sudo apt autoremove
#systemctl --user enable docker-desktop
#service文件位置
#/etc/systemd/system/multi-user.target.wants/docker.service

在驱动容器启动以后,我们可以运行能够挂载GPU的容器了。

反复报错

Docker desktop安装以后,Docker相关命令正常运行,但是就是没有Service服务和Daemon守护进程。
docker正常反映
test
在这里插入图片描述
参考:

  • stackoverflow:docker-desktop does not launch on ubuntu [Failed to start docker-desktop.service: Unit docker-desktop.service is masked]

之前反复重装时卸载步骤

  1. 卸载客户端
sudo apt remove docker-desktop
  1. 删除配置文件
rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
sudo apt purge docker-desktop
  1. 删除无用的软链接

软链接1
软链接2
软链接3

最终结果

# 查看系统内版本
#uname -a不行
cat /etc/issue
# 拉取python镜像
docker pull python:3.11@sha256:7d57b1fef9b7fda8bf331b971a3ca96c3214313666fafdf26d33f1d0e6399222
# 运行python容器
docker run -it --runtime=nvidia --gpus all --name python3-test python:3.11@sha256:7d57b1fef9b7fda8bf331b971a3ca96c3214313666fafdf26d33f1d0e6399222
# 拉取ubuntu镜像
docker pull ubuntu:jammy-20230624@sha256:b060fffe8e1561c9c3e6dea6db487b900100fc26830b9ea2ec966c151ab4c020
# 运行ubuntu容器
docker run -it --runtime=nvidia --gpus all --name ubuntu-test ubuntu:jammy-20230624@sha256:b060fffe8e1561c9c3e6dea6db487b900100fc26830b9ea2ec966c151ab4c020
#拉取Pytorch镜像
docker pull bitnami/pytorch:2.0.1
# 启动pytorch容器
docker run -it --runtime=nvidia --gpus all --name pytorch-test bitnami/pytorch:2.0.1
# 拉取18.0镜像
docker pull ubuntu:bionic-20230530@sha256:dca176c9663a7ba4c1f0e710986f5a25e672842963d95b960191e2d9f7185ebe
# 拉取正版pytorch镜像
docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel
# 运行正版pytorch镜像
docker run -itd --gpus all --name myenv pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel

Docker官方收了多少广告费,搜索Pytorch竟然第一个不是Pytorch社区开发的Pytorch镜像包,而是bitnami下面的。要是能用我就不说什么了,关键还不好用。按下载量排名也轮不上bitnami啊。
搜索结果1真正的pytorch镜像应该是:
搜索结果2
参考:

  • CSDN:docker容器部署pytorch模型,gpu加速部署运行
  • CSDN:史上最详细解决“搭建GPU版Pytorch Docker镜像”教程
  • Docker hub:镜像

狗官方,要是搜索直接显示社区版本的,我也就不用走这么多弯路了,真狗!!!

相关文章:

使用Docker配置深度学习的运行环境

文章目录 推荐实验环境前言docker安装docker操作docker配置常见方法&#xff08;安装包、联网、程序管理器&#xff09;安装驱动的前提要求传统方法安装驱动程序程序管理器安装联网安装deb包安装 安装完成后的设置非传统方法安装-通过容器安装驱动的前提要求安装NVIDIA-Contain…...

三相PMSM的坐标变换

三相PMSM的坐标变换 三相PMSM的数学模型具有复杂性和耦合性的多变量系统。因此需要对其进行降阶和解耦变换。 Vα&#xff0c;Vb&#xff0c;Vc是自然坐标系。 Vα&#xff0c;Vβ是静止坐标系。 Vd&#xff0c;Vq是同步旋转坐标系。 自然坐标系 三相永磁同步电机的驱动电路…...

8.(Python数模)(预测模型一)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…...

Leetcode1006笨阶乘

思路&#xff1a;以4为一个分组分别进行处理 class Solution:def clumsy(self, n: int) -> int:answer_dict {0:0,1: 1, 2: 2, 3: 6, 4: 7}if n > 4:answer n * (n - 1) // (n - 2) n - 3n - 4else:print(answer_dict[n])return answer_dict[n]print(answer)while n …...

阻塞非阻塞IO(BIO和NIO),IO多路复用

1.概念 NIO&#xff08;New Input/Output&#xff09;和BIO&#xff08;Blocking Input/Output&#xff09;是Java中用于处理输入输出的两种不同的模型。 BIO 会阻塞&#xff0c;等有了消息&#xff0c;立刻返回&#xff0c;一个线程处理一个recv&#xff08;需要很多线程&…...

HTTP协议初识·中篇

加上目录&#xff0c;会出现导向不正确的情况&#xff0c;可能是bug&#xff0c;目录一长就容易出错&#xff1f; 本篇主要讲解了&#xff1a; 网页分离(网页代码和.c文件分离) html链接跳转 网页添加图片 确认并返回资源类型 填写正文长度属性 添加表单 临时重定向 补充知识&a…...

数学建模:拟合算法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;拟合算法 文章目录 数学建模&#xff1a;拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…...

计算机网络-笔记-汇总

目录 &#x1f4da; 前言 &#x1f338;章节汇总 &#x1f680; 学习心得 ⌛2023年8月31日 星期四 &#x1f4da; 前言 在学习了【操作系统】、【计算机组成原理】之后 再来学习【计算机网络】&#xff0c;对计算机之间如何通信&#xff0c;有了一个大致的认识。 可以想象…...

STM32定时器定时及其应用

STM32定时器定时及其应用 定时器概述☆定时器相关配置CubeMX工程配置及程序实现固件库程序设计及实现 定时器概述 1. 工作原理 使用精准的时基&#xff0c;通过硬件的方式&#xff0c;实现定时功能。定时器核心就是计数器 2. 定时器分类   基本定时器&#xff08;TIM6~TIM7…...

(牛客) 游游的字符重排(next_permutation的使用)

题目描述 游游定义一个字符串是“好串”&#xff0c;当且仅当该字符串相邻的字符不相等。例如"arcaea"是好串&#xff0c;而"food"不是好串。 游游拿到了一个字符串&#xff0c;她可以将该字符串的各个字符顺序随意打乱。她想知道一共可以生产多少种不同的…...

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器&#xff0c;通常被集成到 SIP 代理服务器中以减小代理服务器媒体传输的压力&#xff0c;其架构如下图所示。这种使用方…...

聚鑫数藏平台——引领数字资产管理新风向

随着数字经济的飞速发展&#xff0c;新金融生态应运而生。区块链技术的崭新突破&#xff0c;使数字资产的重要性日益凸显&#xff0c;为投资者带来了前所未有的机遇和挑战。在此背景下&#xff0c;聚鑫数藏平台横空出世&#xff0c;引领着数字资产管理的新风向。 聚鑫数藏平台&…...

web3j solidity 转java

需要使用的环境 web3j&#xff0c;nodejs 安装编译sol工具 1 $ npm install -g solc 保存为hello.sol文件到本地 1 2 3 4 5 6 7 8 pragma solidity 0.4.19; contract hello { function main(uint a) constant returns (uint b) { uint result a * 8; …...

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章&#xff08;点击跳转&#xff09;uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;uniapp项目实战系列(2)&#xff1a;新建项目&#xff0c;项目搭建&#xff0c;微信开发工具…...

Jwt工具类

导入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> <dependency><groupId>javax.xml.bind</groupId><artifactId>jax…...

计算机网络-笔记-第五章-运输层

&#x1f338;章节汇总 一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 五、第五章——运输层 1、运输层概述 2、运输层端口号、复用、分用 &#xff08;1&#xff0…...

java-参数传递机制

java参数传递机制都是值传递。 基本类型参数传输都是数据值。 传递到方法中的值是拷贝后的值。 引用类型参数传输的都是地址值。 如果是数组的参数传递&#xff0c;那么是引用传递&#xff08;本质上还是值传递&#xff0c;但是由于数组的值传递是传递数组的内存地址&#xf…...

Python编程练习与解答 练习96:字符串是否表示整数

本练习将编写一个名为isInteger的函数&#xff0c;用于确定字符串中的字符是否代表有效整数&#xff0c;确定字符串是否表示整数时&#xff0c;则应忽略开通要或者结尾的任何空白。一旦这个空白被忽略&#xff0c;如果字符串的长度至少是1&#xff0c;且只包含数字&#xff0c;…...

Scala的特质trait与java的interface接口的区别,以及Scala特质的自身类型和依赖注入

1. Scala的特质trait与java接口的区别 Scala中的特质&#xff08;trait&#xff09;和Java中的接口&#xff08;interface&#xff09;在概念和使用上有一些区别&#xff1a; 默认实现&#xff1a;在Java中&#xff0c;接口只能定义方法的签名&#xff0c;而没有默认实现。而在…...

检查js中的字符串是否可以成为回文

探索 JavaScript 中的字符串操作领域揭示了一个令人着迷的挑战&#xff1a;确定给定的字符串是否可以转换为回文。回文&#xff0c;即正反读相同的单词或短语&#xff0c;具有固有的吸引力&#xff0c;并激发了寻求揭开其神秘属性的开发人员的好奇心。在本文中&#xff0c;我们…...

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09; 目录 时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1…...

WebSocket--技术文档--基本概念--《快速了解WebSocket协议》

阿丹&#xff1a; 不断学习新技术&#xff0c;丰富自己了解更多才能扩展更多世界可能。 官网 WebSocket首页、文档和下载 - HTML5开发相关 - OSCHINA - 中文开源技术交流社区 软件简介 WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebS…...

flutter报错-cmdline-tools component is missing

安装完androidsdk和android studio后&#xff0c;打开控制台&#xff0c;出现错误 解决办法 找到自己安装android sdk的位置&#xff0c;然后安装上&#xff0c;并将下面的勾选上 再次运行 flutter doctor 不报错&#xff0c;出现以下画面 Doctor summary (to see all det…...

torch.bmm功能解读

bmm 是 batched matrix multiple 的简写&#xff0c;即批量矩阵乘法&#xff0c;矩阵是二维的&#xff0c;加上batch一个维度&#xff0c;因此该函数的输入必须是两个三维的 tensor&#xff0c;三个维度代表的含义分别是&#xff1a;&#xff08;批量&#xff0c;行&#xff0c…...

如何使用Puppeteer进行金融数据抓取和预测

导语 Puppeteer是一个基于Node.js的库&#xff0c;可以用来控制Chrome或Chromium浏览器&#xff0c;实现网页操作、截图、PDF生成等功能。本文将介绍如何使用Puppeteer进行金融数据抓取和预测&#xff0c;以及如何使用亿牛云爬虫代理提高爬虫效果。 概述 金融数据抓取是指从…...

Linux下 Socket服务器和客户端文件互传

目录 1.项目描述 2.函数准备 2.1 gets函数 2.2 popen函数、fread函数 2.3 access 函数 2.4 exit 函数 2.5 strtok 函数 2.6 chdir函数 3.项目代码 3.1服务器代码 3.2客户端代码 4.问题总结 1.项目描述 基于Soket聊天服务器&#xff0c;实现服务器和客户端的文件传输。…...

Nginx详解 第五部分:Ngnix反向代理(负载均衡 动静分离 缓存 透传 )

Part 5 一、正向代理与反向代理1.1 正向代理简介1.2 反向代理简介 二、配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其余参数 2.2 配置实例:反向代理单台web服务器2.3 代理转发 三、反向代理实现动静分离四、缓存功能五、反向代理客户端的IP透传5.1 原理概述5.2 一…...

中国行政区域带坐标经纬度sql文件及地点获取经纬度方法

文章目录 前言一、如何获取某地的经纬度&#xff1f;1.1 搜索百度地图1.2 在下方找到地图开放平台1.3 下滑找到坐标拾取器1.4 使用 二、sql文件2.1 创建表2.2 插入数据 前言 当工作业务上需要涉及地图&#xff0c;给前端返回经纬度等场景&#xff0c;需要掌握区域经纬度的获取…...

[国产MCU]-W801开发实例-WiFi网络扫描

WiFi网络扫描 文章目录 WiFi网络扫描1、WiFi模块介绍2、WiFi扫描API介绍3、WiFi扫描实例本文将演示如何使用WiFi模块进行WiFi网络扫描。 1、WiFi模块介绍 W801的WiFi具有如下特性: 支持 GB15629.11-2006 IEEE802.11 b/g/n支持 Wi-Fi WMM/WMM-PS/WPA/WPA2/WPS支持 EDCA信道接入…...

SpringBoot使用kafka事务-消费者方

前言 在上一篇文章中&#xff0c;写到了如何在springboot中生产者如何使用kafka的事务&#xff0c;详情链接&#xff1a;Springboot使用kafka事务-生产者方 那么&#xff0c;这一篇就接着上篇所写的内容&#xff0c;讲解一下再springboot中消费者如何使用kafka的事务。 实现…...