docker鏡像配置掛載GPU的實現(xiàn)步驟
我在普通docker中掛載本地GPU設(shè)備,然后成功測試運(yùn)行GPU程序,特此記錄
1、測試GPU程序源碼
首先我寫了一個簡單的GPU測試程序
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
// CUDA 核函數(shù)(Kernel):運(yùn)行在GPU上
__global__ void vectorAdd(const float *a, const float *b, float *c, int n) {
// 計算當(dāng)前線程的全局索引
int idx = blockIdx.x * blockDim.x + threadIdx.x;
// 確保索引在數(shù)組范圍內(nèi),然后執(zhí)行加法
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}
int main() {
// 定義向量長度
const int n = 10000;
const size_t size = n * sizeof(float);
// 在主機(jī)(CPU)上分配并初始化內(nèi)存
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...
}
// 在設(shè)備(GPU)上分配內(nèi)存
float *d_a = nullptr;
float *d_b = nullptr;
float *d_c = nullptr;
cudaMalloc(&d_a, size);
cudaMalloc(&d_b, size);
cudaMalloc(&d_c, size);
// 將數(shù)據(jù)從主機(jī)內(nèi)存復(fù)制到設(shè)備內(nèi)存
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
// 設(shè)置GPU線程的組織結(jié)構(gòu)
int threadsPerBlock = 256; // 每個線程塊包含256個線程
// 計算需要多少個線程塊才能覆蓋整個向量
int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
// 在GPU上啟動核函數(shù)(Kernel)
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_a, d_b, d_c, n);
// 等待GPU上所有線程計算完成
cudaDeviceSynchronize();
// 將計算結(jié)果從設(shè)備內(nèi)存復(fù)制回主機(jī)內(nèi)存
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
// (可選)驗證前10個結(jié)果是否正確
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;
}
}
// 釋放所有申請的內(nèi)存
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的電腦上正常編譯運(yùn)行,結(jié)果應(yīng)該如下
./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設(shè)備及驅(qū)動
先給出成功執(zhí)行命令,后面來一步步解釋關(guān)鍵共享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的時候需要的動態(tài)庫目錄到容器中
-v /usr/local/corex:/usr/local/corex -v /usr/local/cuda-10.2:/usr/local/cuda-10.2
2、路徑雖然共享進(jìn)去了,可能出現(xiàn)找不到動態(tài)庫的情況,所以要把動態(tài)庫添加到環(huán)境變量中
-e LD_LIBRARY_PATH=/usr/local/corex/lib64:/usr/local/cuda-10.2/lib64 \
3、添加GPU 設(shè)備
--device=/dev/iluvatar0 #有些設(shè)備是corex ,則需要配置 --device=/dev/corex
4、加了 --privileged,給 GPU 完整權(quán)限
3、異常測試
3.1、驅(qū)動異常
異常表現(xiàn):
error while loading shared libraries: libcudart.so.10.2: cannot open shared object file
解決方案:
將動態(tài)庫設(shè)置到環(huán)境變量中即可
-e LD_LIBRARY_PATH=/usr/local/corex/lib64:/usr/local/cuda-10.2/lib64
3.2、計算結(jié)果異常
如果出現(xiàn)下面結(jié)果,則說明GPU動態(tài)庫沒有問題,GPU設(shè)備可能沒有掛載,導(dǎo)致計算結(jié)果都是0的異常值
異常表現(xiàn):
./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、設(shè)備異常
異常表現(xiàn)
./GPU_Bin/GPUTest_exedocker: Error response from daemon: error gathering device information while adding custom device "/dev/corex": no such file or directory.
說明設(shè)備中沒有corex設(shè)備
解決方案:
這時候要找到真正的GPU設(shè)備,然后掛載進(jìn)去,可以將/dev文件夾設(shè)備都復(fù)制出來,讓豆包幫你找到真正的GPU設(shè)備
到此這篇關(guān)于docker鏡像配置掛載GPU的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)docker配置掛載GPU內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
部署Docker Registry并配置認(rèn)證登錄教程
DockerRegistry是一個用于存儲和分發(fā)Docker鏡像的無狀態(tài)、高度可擴(kuò)展的服務(wù)器側(cè)應(yīng)用程序,在內(nèi)網(wǎng)環(huán)境下,可以使用DockerRegistry來解決k8s集群的鏡像拉取問題,如果需要開啟認(rèn)證功能,可以直接看配置DockerRegistry認(rèn)證搭建2025-12-12
Docker實現(xiàn)導(dǎo)入導(dǎo)出鏡像(Image)文件的代碼示例
在 Docker 中,鏡像(Image)是容器的基礎(chǔ),包含了應(yīng)用程序運(yùn)行所需的所有文件系統(tǒng)和配置,有時,我們需要將 Docker 鏡像導(dǎo)出到文件中,以便在其他地方使用,以下將詳細(xì)介紹如何使用 Docker 導(dǎo)入導(dǎo)出鏡像文件,需要的朋友可以參考下2024-08-08
docker swarm集群搭建過程對比k8s區(qū)別解析
Docker Swarm和Kubernetes是兩種流行的容器編排工具,它們在服務(wù)部署、高可用性、滾動更新、資源管理和存儲編排方面有所不同,本文給大家介紹docker swarm集群搭建過程對比k8s區(qū)別解析,感興趣的朋友一起看看吧2025-11-11
docker添加網(wǎng)橋并設(shè)置ip地址范圍操作
這篇文章主要介紹了docker添加網(wǎng)橋并設(shè)置ip地址范圍操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

