如何在docker中访问电脑上的GPU?如何在docker中使用GPU进行模型训练或者加载调用?

news2024/11/15 21:56:18

如何在docker中访问电脑上的GPU?如何在docker中使用GPU进行模型训练或者加载调用?

在这里插入图片描述

其实使用非常简单,只是一行命令的事,最主要的事配置好驱动和权限。

docker run -it --rm --gpus all ycj520/centos:1.0.0  nvidia-smi

先看看 stackoverflow 上的问题:

How can I have PyTorch code run via a Docker script use my Apple Silicon GPU (via PyTorch MPS)?

I have a Docker script run.sh that runs some PyTorch code in a Docker container.

The PyTorch code uses device = torch.device(‘mps’ if torch.backends.mps.is_available() else ‘cpu’) to run everything on my MacBook Pro’s GPU via the PyTorch MPS (Metal Performance Shader) backend.

If I run the Python script ml.py without Docker, i.e. in my own Python environment, everything runs on the GPU as expected.

But if I run the same code via the Docker script, it only runs on the CPU, which means torch.backends.mps.is_available() must have returned False.

How can I ensure that the Docker container also uses my GPU?

I’ve seen that for NVIDIA GPUs there is a command docker run --gpus all nvidia-test that enables GPU support but I haven’t seen anything like that for Apple Silicon GPUs.

Docker is Linux, there is no Linux support for the MPS device, since it is MacOS specific. –
Dr. Snoopy
Nov 5, 2023 at 20:03
I see. So Apple would have to release something equivalent to nvidia-docker for this to become feasible? –
Mandelmus100
Nov 5, 2023 at 20:08

No, they would have to implement docker natively, people often forget that Docker is technology based on Linux features, when you use Docker on Windows, you use Linux in a virtual machine, similarly for MacOS. –
Dr. Snoopy
Nov 5, 2023 at 20:10

You likely need a specific set of drivers for the docker container to access the MPS device. This may be useful github.com/pytorch/pytorch/issues/81224 –
Karl
Nov 6, 2023 at 23:58

Related questions
264
docker : invalid reference format
13
Can nvidia-docker be run without a GPU?
19
Can I use my GPU from a docker container on a MacBook Pro ? (AMD Radeon GPU)
333
Why doesn’t Python app print anything when run in a detached docker container?
643
How can I use local Docker images with Minikube?
301
How to keep Docker container running after starting services?
0
How to run perticular code in gpu using PyTorch?
454
Using the RUN instruction in a Dockerfile with ‘source’ does not work

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Can nvidia-docker be run without a GPU?

The official PyTorch Docker image is based on nvidia/cuda, which is able to run on Docker CE, without any GPU. It can also run on nvidia-docker, I presume with CUDA support enabled. Is it possible to run nvidia-docker itself on an x86 CPU, without any GPU? Is there a way to build a single Docker image that takes advantage of CUDA support when it is available (e.g. when running inside nvidia-docker) and uses the CPU otherwise? What happens when you use torch.cuda from inside Docker CE? What exactly is the difference between Docker CE and why can’t nvidia-docker be merged into Docker CE?

在这里插入图片描述


TensorFlow 不再支持在 macOS 上使用 GPU 进行计算,因为苹果已经停止了对 Nvidia GPU 的支持。因此,如果您想要使用 TensorFlow 进行 GPU 计算,您需要使用 Windows 或 Linux 操作系统,并使用支持 NVIDIA GPU 的计算机。

但是,如果您使用 macOS,您仍然可以使用 TensorFlow 进行 CPU 计算,也可以在 Docker 容器中使用 TensorFlow 进行 GPU 计算,前提是您的计算机支持 Docker,并且您已经安装了合适的驱动程序和软件。

对于在 Docker 容器中使用 TensorFlow 进行 GPU 计算,您需要执行以下步骤:

安装 Docker 和 NVIDIA CUDA 驱动程序:根据您的操作系统版本,从 Docker 官方网站下载并安装 Docker,然后从 NVIDIA 官方网站下载并安装 CUDA 驱动程序。

安装 nvidia-docker:nvidia-docker 是一个 Docker 插件,用于在容器中访问宿主机上的 NVIDIA GPU。您可以从 GitHub 上的 nvidia-docker 仓库中获取安装说明和脚本。

下载 TensorFlow Docker 镜像:您可以从 Docker Hub 上下载 TensorFlow Docker 镜像。请确保选择正确的镜像,例如 tensorflow/tensorflow:latest-gpu,这将提供支持 GPU 计算的 TensorFlow 版本。

启动 TensorFlow Docker 容器:使用 docker run 命令启动 TensorFlow Docker 容器,并在命令中指定 TensorFlow Docker 镜像、挂载宿主机的数据目录和其他必要的参数。

测试 TensorFlow GPU 计算:在 TensorFlow Docker 容器中运行 GPU 计算程序,以测试 TensorFlow 是否能够正确地访问 NVIDIA GPU。

需要注意的是,使用 Docker 进行 GPU 计算可能需要较长的启动时间和较大的系统资源,因此您需要确保您的计算机满足要求,以避免出现性能问题。

如何让Mac上的Docker访问GPU?
更新Mac系统至最新版本,并安装Docker Desktop。
安装NVIDIA Docker插件,可以通过以下代码进行安装:

brew install nvidia-docker
brew install --cask nvidia-geforce-now

要将GPU访问授予权限,可以通过在终端中运行以下代码来授权:

sudo spctl kext-consent add com.nvidia.kext

禁用Docker中的rootless模式,也可以通过在终端中运行以下代码来禁用:

sudo sysctl net.ipv4.ip_unprivileged_port_start=0

最后,通过以下代码来运行GPU支持的Docker容器:

docker run --gpus all <image-name>

其中,<image-name>为所需的Docker镜像名称。
注意:

如果您遇到权限问题,请记得在命令前加上“sudo”。
确保所用的Docker镜像已经支持GPU访问。

docker中使用GPU训练的方法

对于tensorflow环境配置,即使替换了M1适配的anaconda,使用苹果官方适配m1的tensorflow安装命令,仍旧出现各种问题,可见现在的M1版anaconda还是存在很大问题。所以在屡次不服气的碰壁下我还是改用了miniforge3…真香!

so,建议使用miniforge3管理,miniforge3可以理解成 miniconda/annoconda 的社区版,提供了更稳定的对M1芯片的支持。
使用miniforge3可成功安装支持m1版的tensorflow及pytorch
MPS介绍
(Mac M1芯片为了追求高性能和节能,在底层设计上使用的是一种叫做arm架构的精简指令集,不同于Intel等常用CPU芯片采用的x86架构完整指令集。所以有些基于x86指令集开发的软件不能直接在Mac M1芯片电脑上使用。)

需要注意的是,使用Mac M1芯片加速 pytorch 不需要安装 cuda后端,因为cuda是适配nvidia的GPU的,Mac M1芯片中的GPU适配的加速后端是mps,在Mac对应操作系统中已经具备,无需单独安装。只需要安装适配的pytorch即可。

MPS使用
去年pytorch官方发布了支持在m1版本的Mac上进行模型加速,所以可以安装gpu版pytorch了。
首先要具备arm64的Python,以及1.12版本以上的pytorch
mps用法和cuda很像,只是将“cuda”改为“mps”

import torch
print(torch.backends.mps.is_available())
print(torch.backends.mps.is_built())

结果:

True#表示macOS版本支持
True#表示mps可用

在 Mac M1的GPU 上运行pytorch 代码,要使用 torch.device(“mps”)来指定,或通过to(device) / to(‘mps:0’) 来把模型或变量转入MPS计算

device = torch.device("mps")
model = ModelName(xxx).to(device)
data = torch.Tensor(dataset.x).to(device)
 

如果报错,只有改成下面这样:

#在parser里面这样定义
parser.add_argument('--device', type=int, default=0)
parser.add_argument('--use_gpu',default=False,action='store_true')

use_gpu = args.use_gpu
device = torch.device("mps" if args.use_gpu else "cpu")

原来的代码:

# torch.cuda.set_device(args.device)
# device = torch.device("cuda" if args.cuda else "cpu")

Linux 配置参考:

nvidia-docker是一个可以使用GPU的docker,nvidia-docker是在docker上做了一层封装,通过nvidia-docker-plugin,然后调用到docker上,其最终实现的还是在docker的启动命令上携带一些必要的参数。因此在安装nvidia-docker之前,还是需要安装docker的。

docker一般都是使用基于CPU的应用,而如果是GPU的话,就需要安装特有的硬件环境,比如需要安装nvidia driver。所以docker容器并不直接支持Nvidia GPU。为了解决这个问题,最早的处理办法是在容器内部,全部重新安装nvidia driver,然后通过设置相应的设备参数来启动container,然而这种办法是很脆弱的。因为宿主机的driver的版本必须完全匹配容器内的driver版本,这样导致docker image无法共享,很可能本地机器的不一致导致每台机器都需要去重复操作,这很大的违背了docker的设计之初。

为了使docker image能很便利的使用Nvidia GPU,从而产生了nvidia-docker,由它来制作nvidia driver的image,这就要求在目标机器上启动container时,确保字符设备以及驱动文件已经被挂载。

nvidia-docker-plugin是一个docker plugin,被用来帮助我们轻松部署container到GPU混合的环境下。类似一个守护进程,发现宿主机驱动文件以及GPU 设备,并且将这些挂载到来自docker守护进程的请求中。以此来支持docker GPU的使用。

需提前安装好的软件
docker
由于nvidia docker是基于docker基础之上运行的,因此需要安装原生的docker。

nvidia显卡驱动
毫无疑问,要想使用GPU,必须要安装显卡驱动,这样nvidia docker才能正常运行。

安装nvidia docker
1、下载nvidia-docker.repo文件,并将该文件输出到/etc/yum.repos.d/nvidia-docker.repo

curl -s -L https://nvidia.github.io/nvidia-docker/centos7/x86_64/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo  

2、查找可安装的nvidia docker版本

yum -y search --showduplicates nvidia-docker

可以从中选择自己需要安装的nvidia docker版本,这里我安装的是docker是1.12.6版本的。因此我选择安装倒数第一个版本的nvidia docker。

3、安装nvidia-docker

yum install nvidia-docker-1.0.1-1.x86_64

点击回车,系统就会安装nvidia-docker,需要选yes\no的地方输入y,再点击回车,最终安装成功。

运行nvidia docker
1、运行docker:

// 运行docker
systemctl start docker
// 加入开机启动
systemctl enable docker
// 查看状态
systemctl status coker

2、运行nvidia-docker:

systemctl start nvidia-docker
systemctl enable nvidia-docker
systemctl status nvidia-docker

nvidia-docker的操作命令与docker基本相同,所以操作起来没有什么障碍。

kubernetes调用GPU
yaml文件配置:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-test
spec:
  volumes:
  - name: nvidia-driver
    hostPath:
      path: /var/lib/nvidia-docker/volumes/nvidia_driver/384.69
  - name: cgroup
    hostPath:
      path: /sys/fs/cgroup
  containers:
  - name: tensorflow
    image: tensorflow:0.11.0-gpu
    ports:
    - containerPort: 8000
    resources:
      limits:
        alpha.kubernetes.io/nvidia-gpu: 1
    volumeMounts:
    - name: nvidia-driver
      mountPath: /usr/local/nvidia/
      readOnly: true
    - name: cgroup
      mountPath: /sys/fs/cgroup

alpha.kubernetes.io/nvidia-gpu: 1:表示只使用1块gpu

path: /var/lib/nvidia-docker/volumes/nvidia_driver/384.69:宿主机driver位置,安装了nvidia-docker之后有的,当然需要保证宿主机nvidia driver是已经安装ok的,应该是安装了nvidia-docker之后,会发现宿主机的driver,然后映射到此。

path: /sys/fs/cgroup:挂载该目录也是为了识别显卡,使容器内部能够使用宿主机显卡。

volumeMounts:将宿主机目录挂载到容器内部,这个标签下的配置项就是要把宿主机目录挂载到容器内部的那个目录,通过name标识。

通过这些目录挂载配置,启动pod之后,容器就能够正常识别GPU并进行工作了。

Centos7安装NVIDIA驱动并在docker容器中使用GPU
Install NVIDIA Driver
1.查看是否禁用nouveau

lsmod | grep nouveau

# 无输出内容表示禁用,如果有输出则需要配置。
# 新建文件
vim /etc/modprobe.d/blacklist.conf
添加如下两行
blacklist nouveau
options nouveau modeset=0
#保存 重启主机,并确认是否禁用

2.安装elrepo源

yum -y install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
 

3.安装nvidia-detect(检查合适的驱动版本)

yum -y install nvidia-detect

检查驱动版本 nvidia-detect -v
 

在这里插入图片描述

4.安装显卡驱动

yum -y install kmod-nvidia
# 注.如果有软件冲突,需要卸载

5.查看安装的版本是否和检测的版本一致
在这里插入图片描述

6.检查驱动是否可用

nvidia-smi

Setting up NVIDIA Container Toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
 
yum-config-manager --enable libnvidia-container-experimental

yum clean expire-cache

sudo yum install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker

sudo systemctl restart docker

sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1429542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…

2024新版阿里云服务器价格计算器,报价不求人自己查

阿里云服务器价格计算器&#xff0c;鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价&#xff0c;报价不求人使用计算器自己查&#xff0c;报价清单支持下载。阿里云服务器网aliyunfuwuqi.com分享阿里云服务器价格计算器链接地址&#xff1a…

Dockerfile构建Nginx访问说明

Dockerfile使用情况 20210903 Dockerfile ,Nginx 参考地址&#xff1a;https://yeasy.gitbook.io/docker_practice/image/build 编写简单Dockerfile 在一个空白目录中&#xff0c;建立一个文本文件&#xff0c;并命名为 Dockerfile&#xff1a; $ mkdir mynginx $ cd myngin…

Blender教程(基础)-切分工具-11

再菜单栏左侧、鼠标左键长按切割工具弹出选项&#xff0c;选择切分工具即可找到切分工具。 一、切割使用 A键全选需要切分的物体&#xff0c;再选择切分后再操作物体上单机长按鼠标左键划分切分范围 选择好切分位置后点击确定如下图所示&#xff1a;Enter键确认切分 二、…

Hugging Face推出自定义AI聊天Assistants;谷歌推出图像生成工具 ImageFX

&#x1f989; AI新闻 &#x1f680; 谷歌推出图像生成工具 ImageFX 摘要&#xff1a;谷歌在 Imagen 2 的基础上推出新的图像生成工具 ImageFX&#xff0c;通过简单的文字提示可以生成高质量图像。该工具包含了提示界面&#xff0c;让用户可以快速尝试创作和想法的相邻维度。…

LLM之Agent(十一)| 多智能体框架CrewAI与AutoGen相比

基于LLM构建的Agent中有一个明显的现象就是多智能体体系结构的表现要超越单智能体&#xff0c;即使单智能体使用无可挑剔的提示策略。本文将探索另一个有趣的多智能体框架——CrewAI。 一、CrewAI整体优势 CrewAI可以应用在生成环境中。它在发言人的反应和编排上牺牲了一点灵活…

kubecolor让kubelet更好看

kubecolor让kubelet更好看 默认情况下kubectl输出都是白色,在列特别多的情况下比较难分清楚具体是哪个对应哪个. 发现kubecolor可以完美解决这样的问题. 1. 安装kubecolor mkdir kubecolor cd kubecolor wget https://github.com/kubecolor/kubecolor/releases/download/v0.…

uniapp 项目请求接口千万别写死

我接手我徒弟的项目发现有一个请求接口是写死的。比如这种 config.baseUrlhttps://www.test1.cn/这样写虽然没有问题&#xff0c;但是如果遇到上传或下载接口 而且每个文件都有 这么多文件都写死 不利于维护。 下面我优化的是这样 新建一个config/index.js 引入方法 /config …

c# Get方式调用WebAPI,WebService等接口

/// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// </summary> public class WebServiceHelper {//<webServices>// <protocols>// <add name"HttpGet"/>// <add name"HttpPost"/>// …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

【国产MCU】-CH32V307-GPIO控制:输入与输出

GPIO控制:输入与输出 文章目录 GPIO控制:输入与输出1、GPIO简单介绍2、驱动API介绍3、GPIO配置代码实现3.1 GPIO配置为输出3.2 GPIO配置为输入CH32V307的GPIO口可以配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏功能。GPIO口还可以复用成其他…

设计模式——2_1 命令(Command)

文章目录 定义图纸一个例子&#xff1a;空调和他的遥控器只有控制面板的空调遥控器可以撤销的操作 碎碎念命令和Runnable命令和事务 定义 把请求封装成一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持…

2024美国数学建模竞赛A题完整版思路+代码+数据+后续高质量参考论文

2024 MCM 问题A: 资源 用性和性 &#xff08;完整版见文末&#xff09; 题目翻译&#xff1a; 虽然有些动物物种存在于通常的雌雄两性之外&#xff0c;但大多数物种基本上是雌性或雄性。尽管许 多物种在出生时呈现1:1的性别比&#xff0c;但其他物种则偏离了均等的性别比。这…

jsp粉丝社区系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 粉丝社区系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

在Vue中如何构建复杂表单?

概述 很有可能&#xff0c;在我们的软件工程旅程中&#xff0c;我们至少要构建一次复杂的表单。本文将介绍如何创建一个复杂的表单&#xff0c;该表单可以使用一些Vue特性(如v-for和v-model)逐步增强。它还提供了一些基本的Vue核心功能的复习&#xff0c;这些功能将在您日常使…

Swift 入门之自定义类型的模式匹配(Pattern Matching)

概览 小伙伴们都知道 Swift 是一门简洁、类型安全、极富表现力以及“性感迷人”的编程语言。 和大多数语言一样&#xff0c;在 Swift 中也有一些隐藏着的、不为人知的宝藏特性。利用它们我们可以极大增加撸码的愉悦和成就感。 其中&#xff0c;模式匹配&#xff08;Pattern …

Linux---动静态库

动静态库的相关概念 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

【HarmonyOS】鸿蒙开发之ArkTs初步认识——第2.1章

ArkTs简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 以下图可以展示Js&#xff0c;TS&#xff0c;ArkTs的关系 ArkTs基础语…

比收费还好用,6个自学python必看网站

今天给大家分享几个自学python经常用到的网站&#xff0c;非常实用&#xff0c;建议收藏&#xff01; 1.中文版官方教程 https://docs.python.org/zh-cn/3/tutorial/errors.html#defining-clean-up-actions 你可以从这里下载Python、使用、学习Python。官方文档自然是最权威的…