docker镜像配置挂载GPU的实现步骤

 更新时间:2026年04月14日 08:11:09   作者:鸿儒517  
本文记录了在普通Docker容器中成功挂载本地GPU设备并运行GPU程序的完整过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

我在普通docker中挂载本地GPU设备,然后成功测试运行GPU程序,特此记录

1、测试GPU程序源码

首先我写了一个简单的GPU测试程序

#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
// CUDA 核函数(Kernel):运行在GPU上
__global__ void vectorAdd(const float *a, const float *b, float *c, int n) {
    // 计算当前线程的全局索引
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    // 确保索引在数组范围内,然后执行加法
    if (idx < n) {
        c[idx] = a[idx] + b[idx];
    }
}
int main() {
    // 定义向量长度
    const int n = 10000;
    const size_t size = n * sizeof(float);
    // 在主机(CPU)上分配并初始化内存
    float *h_a = new float[n];
    float *h_b = new float[n];
    float *h_c = new float[n];
    for (int i = 0; i < n; i++) {
        h_a[i] = static_cast<float>(i);       // 例如: 0.0, 1.0, 2.0...
        h_b[i] = static_cast<float>(i * 2);   // 例如: 0.0, 2.0, 4.0...
    }
    // 在设备(GPU)上分配内存
    float *d_a = nullptr;
    float *d_b = nullptr;
    float *d_c = nullptr;
    cudaMalloc(&d_a, size);
    cudaMalloc(&d_b, size);
    cudaMalloc(&d_c, size);
    // 将数据从主机内存复制到设备内存
    cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
    // 设置GPU线程的组织结构
    int threadsPerBlock = 256; // 每个线程块包含256个线程
    // 计算需要多少个线程块才能覆盖整个向量
    int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
    // 在GPU上启动核函数(Kernel)
    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_a, d_b, d_c, n);
    // 等待GPU上所有线程计算完成
    cudaDeviceSynchronize();
    // 将计算结果从设备内存复制回主机内存
    cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
    // (可选)验证前10个结果是否正确
    std::cout << "Checking the first 10 results..." << std::endl;
    std::cout << "t" << "CPU" << "tt" << "GPU" << std::endl;
    for (int i = 0; i < 10; i++) {
        float expected = h_a[i] + h_b[i];
        if (std::abs(h_c[i] - expected) > 1e-5) {
            std::cout << "Error at index " << i << ": " << h_c[i] << " != " << expected << std::endl;
        } else {
            std::cout << "t" << expected << "tt" << h_c[i] << " [PASS]" << std::endl;
        }
    }
    // 释放所有申请的内存
    delete[] h_a;
    delete[] h_b;
    delete[] h_c;
    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);
    std::cout << "Vector addition completed successfully!" << std::endl;
    return 0;
}

如果在带GPU的电脑上正常编译运行,结果应该如下

./GPUTest_exe 
Checking the first 10 results...
tCPUttGPU
t0tt0 [PASS]
t3tt3 [PASS]
t6tt6 [PASS]
t9tt9 [PASS]
t12tt12 [PASS]
t15tt15 [PASS]
t18tt18 [PASS]
t21tt21 [PASS]
t24tt24 [PASS]
t27tt27 [PASS]
Vector addition completed successfully!

2、docker中配置GPU设备及驱动

先给出成功执行命令,后面来一步步解释关键共享GPU代码

docker run --memory=10g --memory-swap=10g --rm \
-v /Bin_Release:/JX \
-v /usr/local/corex:/usr/local/corex \
-v /usr/local/cuda-10.2:/usr/local/cuda-10.2 \
-v /usr/lib64:/usr/lib64 \
-e LD_LIBRARY_PATH=/usr/local/corex/lib64:/usr/local/cuda-10.2/lib64 \
--device=/dev/iluvatar0 \
--privileged \
-w /docker_test:v1.0 \
./GPU_Bin/GPUTest_exe

1、用-v 共享编译GPU的时候需要的动态库目录到容器中

-v /usr/local/corex:/usr/local/corex 
-v /usr/local/cuda-10.2:/usr/local/cuda-10.2 

2、路径虽然共享进去了,可能出现找不到动态库的情况,所以要把动态库添加到环境变量中

-e LD_LIBRARY_PATH=/usr/local/corex/lib64:/usr/local/cuda-10.2/lib64 \

3、添加GPU 设备

--device=/dev/iluvatar0
#有些设备是corex ,则需要配置
--device=/dev/corex

4、加了 --privileged,给 GPU 完整权限

3、异常测试

3.1、驱动异常

异常表现:

error while loading shared libraries: libcudart.so.10.2: cannot open shared object file

解决方案:
将动态库设置到环境变量中即可

-e LD_LIBRARY_PATH=/usr/local/corex/lib64:/usr/local/cuda-10.2/lib64

3.2、计算结果异常

如果出现下面结果,则说明GPU动态库没有问题,GPU设备可能没有挂载,导致计算结果都是0的异常值

异常表现:

./GPU_Bin/GPUTest_exe
Checking the first 10 results...
tCPUttGPU
t0tt0 [PASS]
Error at index 1: 0 != 3
Error at index 2: 0 != 6
Error at index 3: 0 != 9
Error at index 4: 0 != 12
Error at index 5: 0 != 15
Error at index 6: 0 != 18
Error at index 7: 0 != 21
Error at index 8: 0 != 24
Error at index 9: 0 != 27
Vector addition completed successfully!

解决方案:

--device=/dev/corex

3.3、设备异常

异常表现

./GPU_Bin/GPUTest_exedocker: Error response from daemon: error gathering device information while adding custom device "/dev/corex": no such file or directory.

说明设备中没有corex设备

解决方案:
这时候要找到真正的GPU设备,然后挂载进去,可以将/dev文件夹设备都复制出来,让豆包帮你找到真正的GPU设备

到此这篇关于docker镜像配置挂载GPU的实现步骤的文章就介绍到这了,更多相关docker配置挂载GPU内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 部署Docker Registry并配置认证登录教程

    部署Docker Registry并配置认证登录教程

    DockerRegistry是一个用于存储和分发Docker镜像的无状态、高度可扩展的服务器侧应用程序,在内网环境下,可以使用DockerRegistry来解决k8s集群的镜像拉取问题,如果需要开启认证功能,可以直接看配置DockerRegistry认证搭建
    2025-12-12
  • Docker实现导入导出镜像(Image)文件的代码示例

    Docker实现导入导出镜像(Image)文件的代码示例

    在 Docker 中,镜像(Image)是容器的基础,包含了应用程序运行所需的所有文件系统和配置,有时,我们需要将 Docker 镜像导出到文件中,以便在其他地方使用,以下将详细介绍如何使用 Docker 导入导出镜像文件,需要的朋友可以参考下
    2024-08-08
  • docker swarm集群搭建过程对比k8s区别解析

    docker swarm集群搭建过程对比k8s区别解析

    Docker Swarm和Kubernetes是两种流行的容器编排工具,它们在服务部署、高可用性、滚动更新、资源管理和存储编排方面有所不同,本文给大家介绍docker swarm集群搭建过程对比k8s区别解析,感兴趣的朋友一起看看吧
    2025-11-11
  • docker运行项目的方法

    docker运行项目的方法

    在本篇文章里小编给大家分享的是关于docker运行项目的方法和实例,需要的朋友们学习参考下。
    2020-03-03
  • docker引起服务器磁盘爆满的问题解决

    docker引起服务器磁盘爆满的问题解决

    本文主要介绍了docker引起服务器磁盘爆满的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 解决nacos启动时防火墙开启8848的坑

    解决nacos启动时防火墙开启8848的坑

    最近操作Nacos时遭遇8848端口无法访问的问题,尝试通过安全组和firewall配置仍无法解决,最终发现,firewall对Docker使用专门的作用域,需要在相应作用域下开放端口,务必检查firewall中针对Docker的设置,确保8848端口在正确的作用域内被允许通行
    2022-10-10
  • Docker v1.13 新功能介绍

    Docker v1.13 新功能介绍

    本篇文章主要介绍了Docker v1.13 新功能介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Docker部署Gitea服务的实现

    Docker部署Gitea服务的实现

    本文主要介绍了Docker部署Gitea服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • docker添加网桥并设置ip地址范围操作

    docker添加网桥并设置ip地址范围操作

    这篇文章主要介绍了docker添加网桥并设置ip地址范围操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • docker容器/etc/hosts文件修改方法

    docker容器/etc/hosts文件修改方法

    在容器内部,当需要访问其他容器或主机时,可以通过/etc/hosts文件来解析主机名,从而实现网络通信,这篇文章主要介绍了docker容器/etc/hosts文件,需要的朋友可以参考下
    2023-06-06

最新评论