LinuxのGPU機械学習環境構築: GPUドライバ/CUDA toolkitのインストール

Ubuntu Desktop Datascience環境構築 2/N

公開日: 2021-04-26

Table of Contents

実行環境

項目  
マシン HP ENVY TE01-0xxx
OS ubuntu 20.04 LTS Focal Fossa
CPU Intel Core i7-9700 CPU 3.00 GHz
RAM 32.0 GB
GPU NVIDIA GeForce RTX 2060 SUPER

解決したい問題

  • デフォルトだとGPUのドライバがインストールされていないため、ディスプレイに表示される画面も解像度が低く、またこのままでは機械学習などの仕事をするときにGPUが使えない
  • NVIDIA gpu driverをインストールする

方針と実行

基本方針は

  1. NDIVIA GPU repositoryの追加
  2. 推奨ドライバーの確認
  3. 推奨ドライバーのインストールとreboot
  4. CUDA toolkitのインストール & Compile test

apt repositoryの追加

オフィシャルリポジトリのNDIVIA GPU driverは古いバージョンしかない恐れがあるので、まずこちらのNDIVIA レポジトリを追加します.

1
2
3
% sudo apt update && sudo apt upgrade
% sudo add-apt-repository ppa:graphics-drivers/ppa
% sudo apt update

GPU driverのインストール

1
2
3
4
5
6
7
8
% ubuntu-drivers devices
vendor   : NVIDIA Corporation
model    : TU106 [GeForce RTX 2060 SUPER]
driver   : nvidia-driver-460 - third-party non-free recommended
driver   : nvidia-driver-460-server - distro non-free
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-465 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

nvidia-driver-460recommendedとなっているのでこれをインストールします. その後、再起動します.

1
2
% sudo apt install -y nvidia-driver-460
% reboot

再起動するとnvidia-smiコマンドが使えて、ドライバが機能します。その確認方法として nvidia-smi コマンドがあります.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
% nvidia-smi
Mon Jun 14 21:54:28 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.84       Driver Version: 460.84       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. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 206...  Off  | 00000000:01:00.0  On |                  N/A |
| 43%   43C    P0    43W / 175W |   1296MiB /  7974MiB |      9%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      xxxx      G   /usr/lib/xorg/Xorg                 77MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/xorg/Xorg                293MiB |
|    0   N/A  N/A      xxxx      G   /usr/bin/gnome-shell              110MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/firefox/firefox          765MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/firefox/firefox            3MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/firefox/firefox            3MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/firefox/firefox            3MiB |
|    0   N/A  N/A      xxxx      G   /usr/lib/firefox/firefox            3MiB |
+-----------------------------------------------------------------------------+

GPUの設定画面を開く

nvidia-settingsコマンドでGPUの設定画面を開くことができる

1
% nvidia-settings

CUDA toolkitのインストール

1
2
3
4
5
6
7
% sudo apt update
% sudo apt install nvidia-cuda-toolkit
% nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

CUDAコードサンプルのCompile

以下のコードをhello.cuというファイルで作成し, テストする.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>

__global__
void saxpy(int n, float a, float *x, float *y)
{
  int i = blockIdx.x*blockDim.x + threadIdx.x;
  if (i < n) y[i] = a*x[i] + y[i];
}

int main(void)
{
  int N = 1<<20;
  float *x, *y, *d_x, *d_y;
  x = (float*)malloc(N*sizeof(float));
  y = (float*)malloc(N*sizeof(float));

  cudaMalloc(&d_x, N*sizeof(float)); 
  cudaMalloc(&d_y, N*sizeof(float));

  for (int i = 0; i < N; i++) {
    x[i] = 1.0f;
    y[i] = 2.0f;
  }

  cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);

  // Perform SAXPY on 1M elements
  saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);

  cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);

  float maxError = 0.0f;
  for (int i = 0; i < N; i++)
    maxError = max(maxError, abs(y[i]-4.0f));
  printf("Max error: %f\n", maxError);

  cudaFree(d_x);
  cudaFree(d_y);
  free(x);
  free(y);
}

Compile Test

1
2
3
% nvcc -o hello hello.cu 
% ./hello 
Max error: 0.000000

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)