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 alldocker run 时候,这两个命令有什么区别?

这两个命令在 Docker 中的功能类似,但它们是不同的方式来控制 GPU 的可见性和使用。让我们详细说明一下:

  1. -e NVIDIA_VISIBLE_DEVICES=all:

    • 这是通过设置环境变量来控制哪些 GPU 对容器可见。
    • NVIDIA_VISIBLE_DEVICES 是 NVIDIA Docker 提供的环境变量,用来指定可以暴露给容器的 GPU。all 表示暴露所有可用的 GPU。
    • 这个命令的效果是让容器能够看到并使用主机上的所有 GPU。
    • 适用于使用 nvidia-docker 或基于 NVIDIA Container Toolkit 的场景。
  2. --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 的步骤:

  1. 使用支持 CUDA 的 Docker 镜像

首先,你需要一个支持 GPU 的 Docker 镜像。NVIDIA 提供了许多这样的镜像,例如 nvidia/cuda。下面是如何使用这些镜像来测试 GPU 支持的步骤:

拉取一个支持 CUDA 的 Docker 镜像

  1. 拉取一个包含 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 镜像

  1. 拉取适合 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

  1. 运行测试容器,验证是否能访问 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
posted @   Zenith_Hugh  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2023-06-05 pytorch 的 torchvision.datasets.ImageFolder 来自定义数据集
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

微信打赏