docker 免 sudo 和 使用 gpu 和 nvidia arm 拉镜像
1. docker 免 sudo
docker images
运行说禁止定义。需要免 sudo
ll /var/run/docker.sock srw-rw---- 1 root docker 0 Aug 19 12:37 /var/run/docker.sock
表示只有 root 用户和 docker 组的用户能够访问该套接字。
因此把当前用户加入 docker 组就行
将当前用户加入组docker:
sudo gpasswd -a ${USER} docker
激活对组的更改:
newgrp docker
再次尝试即可。
2. docker 无法使用 gpu
--gpus all
报错:docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
ERRO[0000] error waiting for container: context canceled
原因:没有 安装 NVIDIA Container Toolkit
nvidia-container-cli --version nvidia-container-cli: command not found
安装 NVIDIA Container Toolkit
添加 NVIDIA 包存储库和 GPG 密钥:
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
更新包列表并安装 NVIDIA Container Toolkit:
sudo apt-get update sudo apt-get install -y nvidia-container-toolkit
重启 Docker 服务:
sudo systemctl restart docker
然后启动容器即可在容器中使用 gpu。
问题: -e NVIDIA_VISIBLE_DEVICES=all
和 --gpus all
在 docker run
时候,这两个命令有什么区别?
这两个命令在 Docker 中的功能类似,但它们是不同的方式来控制 GPU 的可见性和使用。让我们详细说明一下:
-
-e NVIDIA_VISIBLE_DEVICES=all
:- 这是通过设置环境变量来控制哪些 GPU 对容器可见。
NVIDIA_VISIBLE_DEVICES
是 NVIDIA Docker 提供的环境变量,用来指定可以暴露给容器的 GPU。all
表示暴露所有可用的 GPU。- 这个命令的效果是让容器能够看到并使用主机上的所有 GPU。
- 适用于使用
nvidia-docker
或基于 NVIDIA Container Toolkit 的场景。
-
--gpus all
:- 这是 Docker 版本 19.03 及以上的原生 GPU 支持选项。
--gpus all
表示允许容器使用主机上的所有 GPU。- 这是 Docker 官方提供的 GPU 支持方式,和 NVIDIA 的环境变量配置方式类似,但这是更现代的做法,并且集成更深。
总结:
-e NVIDIA_VISIBLE_DEVICES=all
是 NVIDIA Docker 工具链中的配置选项,适用于特定依赖 NVIDIA Container Toolkit 的场景。--gpus all
是 Docker 的原生 GPU 管理方式,推荐使用这种方式,尤其是在使用 Docker 19.03 及以上版本时。
如果你的 Docker 版本较新,建议优先使用 --gpus all
,因为这是 Docker 官方支持的方式,集成性和兼容性更好。
3. 测试:
3.1 对于 amd64 架构:
你的 hello-world
镜像非常基础,它仅仅用于验证 Docker 是否正确安装,并不会提供 GPU 支持。要测试 Docker 容器是否能访问 GPU,你需要使用一个支持 CUDA 的 Docker 镜像。以下是如何测试 Docker 容器是否能够使用 GPU 的步骤:
- 使用支持 CUDA 的 Docker 镜像
首先,你需要一个支持 GPU 的 Docker 镜像。NVIDIA 提供了许多这样的镜像,例如 nvidia/cuda
。下面是如何使用这些镜像来测试 GPU 支持的步骤:
拉取一个支持 CUDA 的 Docker 镜像
- 拉取一个包含 CUDA 的 Docker 镜像,比如
nvidia/cuda:11.2.2-base
:sudo docker pull nvidia/cuda:11.2.2-base
运行带有 GPU 支持的 Docker 容器
运行 Docker 容器并测试 GPU。使用 --gpus all
选项来允许容器访问所有 GPU:
sudo docker run --gpus all --rm nvidia/cuda:11.2.2-base nvidia-smi
如果你的 Docker 和 NVIDIA 驱动配置正确,你应该能够看到类似于以下的输出:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage GPU-Util Compute M. | |=============================================================================| | 0 NVIDIA GeForce GTX 1... On | 0000:65:00.0 Off | N/A | | 30% 29C P8 20W / 250W | 0MiB / 8192MiB | 0% Default | |=============================================================================|
使用支持 CUDA 的 Docker 镜像(例如 nvidia/cuda
)并运行 nvidia-smi
或其他 CUDA 程序来检查 GPU 是否可用。
确保 Docker 和 NVIDIA 驱动程序正确配置,才能使 GPU 在 Docker 容器内可用。
删除镜像:
sudo docker rmi nvidia/cuda:11.2.2-base
3.2 arm 64 架构
从错误信息来看,你的 NVIDIA Xavier NX 是基于 ARM 架构(linux/arm64/v8
),而 nvidia/cuda:11.2.2-base
镜像是为 x86 架构(linux/amd64
)设计的。这是造成错误的原因。
在 ARM 架构的设备上,你需要使用适合 ARM64 的 Docker 镜像来进行测试。NVIDIA 提供了一些支持 ARM 架构的 Docker 镜像和工具包。下面是如何解决这个问题的步骤:
选择适合 ARM64 的 Docker 镜像
对于 ARM 架构的 Jetson 设备,NVIDIA 提供了适合 ARM64 的 Docker 镜像。这些镜像可以从 NVIDIA 的 Docker Hub 仓库中找到。
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-jetpack
使用 NVIDIA 提供的 ARM64 CUDA Docker 镜像
- 拉取适合 ARM64 的 CUDA Docker 镜像。NVIDIA 提供了支持 ARM64 架构的 CUDA 基础镜像。你可以使用以下镜像:
docker pull nvcr.io/nvidia/l4t-jetpack:r35.4.1
我草!你发现会拉不下来!你需要登录才行。
参考:https://blog.itdevwu.com/post/1821/
这里的坑大多是网络问题。我们使用了魔法。
sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/https-proxy.conf <<-'EOF' [Service] Environment="HTTP_PROXY=http://127.0.0.1:7890/" Environment="HTTPS_PROXY=http://127.0.0.1:7890/" Environment="NO_PROXY=localhost,127.0.0.1" EOF
注意这里是 https
这样我们才能:
docker login nvcr.io Username: $oauthtoken Password: WARNING! Your password will be stored unencrypted in /home/xx/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credential-stores Login Succeeded
注意这里的 用户名是: $oauthtoken
-
运行测试容器,验证是否能访问 GPU:
xhost + docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-jetpack:r35.4.1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2023-06-05 pytorch 的 torchvision.datasets.ImageFolder 来自定义数据集