Ryzen5-3400GE 上の Ubuntu 18.04 に ROCm 4.0 をインストールする

2021年1月27日
##概要：
格安値引きPCにGPUコンピューティング環境を構築する。
##1.　はじめに
2020年春、Ryzen5-3400GE を搭載し格安値引きで話題となったPCを購入した。
このPCで、近年話題の人工知能やら機械学習やらをしたくなったので調べてみた。
人工知能や機械学習には、GPUコンピューティング環境が要るらしい。
そこで、Ryzen5-3400GE に GPUコンピューティング環境を載せてみる。

##2.　ROCｍ（Radeon Open Compute）GPUコンピューティング 
CPU の2大メーカは、Intel と AMD(Advanced Micro Devices, Inc) 
GPU の2大メーカは、nVIDIA と AMD(Advanced Micro Devices, Inc)
しかしながら GPUコンピューティングは nVIDIA の CUDA 一択であった。
AMD の GPUコンピューティング　ROCｍ（Radeon Open Compute）は情報が少なく、Radeon グラフィック・ボードには対応しても、Ryzen5-3400GE　など APU は対応しないものと半ば諦めていた。
最近になって、GPUコンピューティングの構成要素 llvm に AMD GPU に関する更新があり、幾つかの APU が追加されたので、ものは試しとインストールしてみた。

##3.　インストールの前準備
####１）Ubuntu 18.04 のクリーン・インストール
クリーン・インストールの後、最低限の開発ツールをインストールする。

```
$ sudo apt update
$ sudo apt upgrade -y 
$ sudo apt install build-essential openjdk-11-jdk cmake git
```
####２）GCC / GLIBC ABI のバージョン確認とアップデート
libstd++.6.0.26 よりバージョンが新しいことを確認する。

```
$ ll /usr/lib/x86_64-linux-gnu/libstdc++.so.6
```
バージョンが古い場合は、新しいものに更新する。

```
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt update
$ sudo apt upgrade -y
$ ll /usr/lib/x86_64-linux-gnu/libstdc++.so.6
$ reboot
```  

####３）Hardware Enablement Stack (HWE) の確認
HWEに対応しているか確認する。対応している場合、以下のメッセージが現れる。

```
$ hwe-support-status --verbose
Your Hardware Enablement Stack (HWE) is supported until 4月 2023.
```
対応していない場合は、HWE対応版カーネルをインストールする。

```
$ sudo apt install --install-recommends linux-generic-hwe-18.04 xserver-xorg-hwe-18.04 -y
$ reboot
$ hwe-support-status --verbose

```

##4.　ROCm のインストール
[ROCm Installation Guide](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html) に沿って ROCm をインストールする。
####1）NUMA (Non-Uniform Memory Architecture) ライブラリのインストール
CPU-GPU 間の情報交換のためのライブラリをインストールする。

```
$ sudo apt update
$ sudo apt dist-upgrade -y
$ sudo apt install libnuma-dev
$ sudo reboot
```
####2) ROCm apt リポジトリの追加
ROCm の apt リポジトリを追加する。

```
$ wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add -
$ echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list
```
####3) ROCm の dkms パッケージと dev パッケージのインストール
ROCm の  dkms パッケージと dev パッケージのインストールする。

```
$ sudo apt update
$ sudo apt install rocm-dkms rocm-dev -y
$ sudo reboot
```
####4) 権限(permissions)の追加
利用者に GPU を使用するための権限(permissions)を追加する。

```
$ sudo usermod -a -G video $LOGNAME
$ sudo usermod -a -G render $LOGNAME #for ubuntu20.04
$ echo 'ADD_EXTRA_GROUPS=1' | sudo tee -a /etc/adduser.conf
$ echo 'EXTRA_GROUPS=video' | sudo tee -a /etc/adduser.conf
$ echo 'EXTRA_GROUPS=render' | sudo tee -a /etc/adduser.conf
$ reboot
```
####5) 正常インストールの確認
以下のコマンドで、ROCm が正常にインストールできたことを確認する。

```
$ /opt/rocm/bin/rocminfo
$ /opt/rocm/opencl/bin/clinfo
```

<details><summary>$ /opt/rocm/bin/rocminfo の実行結果</summary>
<div>

```
$ /opt/rocm/bin/rocminfo
ROCk module is loaded
Able to open /dev/kfd read-write
=====================    
HSA System Attributes    
=====================    
Runtime Version:         1.1
System Timestamp Freq.:  1000.000000MHz
Sig. Max Wait Duration:  18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model:           LARGE                              
System Endianness:       LITTLE                             

==========               
HSA Agents               
==========               
*******                  
Agent 1                  
*******                  
  Name:                    AMD Ryzen 5 PRO 3400GE w/ Radeon Vega Graphics
  Uuid:                    CPU-XX                             
  Marketing Name:          AMD Ryzen 5 PRO 3400GE w/ Radeon Vega Graphics
  Vendor Name:             CPU                                
  Feature:                 None specified                     
  Profile:                 FULL_PROFILE                       
  Float Round Mode:        NEAR                               
  Max Queue Number:        0(0x0)                             
  Queue Min Size:          0(0x0)                             
  Queue Max Size:          0(0x0)                             
  Queue Type:              MULTI                              
  Node:                    0                                  
  Device Type:             CPU                                
  Cache Info:              
    L1:                      32(0x20) KB                        
  Chip ID:                 5592(0x15d8)                       
  Cacheline Size:          64(0x40)                           
  Max Clock Freq. (MHz):   3300                               
  BDFID:                   768                                
  Internal Node ID:        0                                  
  Compute Unit:            8                                  
  SIMDs per CU:            4                                  
  Shader Engines:          1                                  
  Shader Arrs. per Eng.:   1                                  
  WatchPts on Addr. Ranges:4                                  
  Features:                None
  Pool Info:               
    Pool 1                   
      Segment:                 GLOBAL; FLAGS: KERNARG, FINE GRAINED
      Size:                    8388224(0x7ffe80) KB               
      Allocatable:             TRUE                               
      Alloc Granule:           4KB                                
      Alloc Alignment:         4KB                                
      Accessible by all:       TRUE                               
  ISA Info:                
    N/A                      
*******                  
Agent 2                  
*******                  
  Name:                    gfx902                             
  Uuid:                    GPU-XX                             
  Marketing Name:          AMD Ryzen 5 PRO 3400GE w/ Radeon Vega Graphics
  Vendor Name:             AMD                                
  Feature:                 KERNEL_DISPATCH                    
  Profile:                 FULL_PROFILE                       
  Float Round Mode:        NEAR                               
  Max Queue Number:        128(0x80)                          
  Queue Min Size:          4096(0x1000)                       
  Queue Max Size:          131072(0x20000)                    
  Queue Type:              MULTI                              
  Node:                    0                                  
  Device Type:             GPU                                
  Cache Info:              
    L1:                      16(0x10) KB                        
  Chip ID:                 5592(0x15d8)                       
  Cacheline Size:          64(0x40)                           
  Max Clock Freq. (MHz):   1300                               
  BDFID:                   768                                
  Internal Node ID:        0                                  
  Compute Unit:            11                                 
  SIMDs per CU:            4                                  
  Shader Engines:          1                                  
  Shader Arrs. per Eng.:   1                                  
  WatchPts on Addr. Ranges:4                                  
  Features:                KERNEL_DISPATCH 
  Fast F16 Operation:      FALSE                              
  Wavefront Size:          64(0x40)                           
  Workgroup Max Size:      1024(0x400)                        
  Workgroup Max Size per Dimension:
    x                        1024(0x400)                        
    y                        1024(0x400)                        
    z                        1024(0x400)                        
  Max Waves Per CU:        160(0xa0)                          
  Max Work-item Per CU:    10240(0x2800)                      
  Grid Max Size:           4294967295(0xffffffff)             
  Grid Max Size per Dimension:
    x                        4294967295(0xffffffff)             
    y                        4294967295(0xffffffff)             
    z                        4294967295(0xffffffff)             
  Max fbarriers/Workgrp:   32                                 
  Pool Info:               
    Pool 1                   
      Segment:                 GROUP                              
      Size:                    64(0x40) KB                        
      Allocatable:             FALSE                              
      Alloc Granule:           0KB                                
      Alloc Alignment:         0KB                                
      Accessible by all:       FALSE                              
  ISA Info:                
    ISA 1                    
      Name:                    amdgcn-amd-amdhsa--gfx902+xnack    
      Machine Models:          HSA_MACHINE_MODEL_LARGE            
      Profiles:                HSA_PROFILE_BASE                   
      Default Rounding Mode:   NEAR                               
      Default Rounding Mode:   NEAR                               
      Fast f16:                TRUE                               
      Workgroup Max Size:      1024(0x400)                        
      Workgroup Max Size per Dimension:
        x                        1024(0x400)                        
        y                        1024(0x400)                        
        z                        1024(0x400)                        
      Grid Max Size:           4294967295(0xffffffff)             
      Grid Max Size per Dimension:
        x                        4294967295(0xffffffff)             
        y                        4294967295(0xffffffff)             
        z                        4294967295(0xffffffff)             
      FBarrier Max Size:       32                                 
*** Done ***             

```
</div>
</details>


<details><summary>$ /opt/rocm/opencl/bin/clinfo の実行結果</summary>
<div>

```
$ /opt/rocm/opencl/bin/clinfo
Number of platforms:				 1
  Platform Profile:				 FULL_PROFILE
  Platform Version:				 OpenCL 2.0 AMD-APP (3212.0)
  Platform Name:				 AMD Accelerated Parallel Processing
  Platform Vendor:				 Advanced Micro Devices, Inc.
  Platform Extensions:				 cl_khr_icd cl_amd_event_callback 


  Platform Name:				 AMD Accelerated Parallel Processing
Number of devices:				 1
  Device Type:					 CL_DEVICE_TYPE_GPU
  Vendor ID:					 1002h
  Board name:					 AMD Ryzen 5 PRO 3400GE w/ Radeon Vega Graphics
  Device Topology:				 PCI[ B#3, D#0, F#0 ]
  Max compute units:				 11
  Max work items dimensions:			 3
    Max work items[0]:				 1024
    Max work items[1]:				 1024
    Max work items[2]:				 1024
  Max work group size:				 256
  Preferred vector width char:			 4
  Preferred vector width short:			 2
  Preferred vector width int:			 1
  Preferred vector width long:			 1
  Preferred vector width float:			 1
  Preferred vector width double:		 1
  Native vector width char:			 4
  Native vector width short:			 2
  Native vector width int:			 1
  Native vector width long:			 1
  Native vector width float:			 1
  Native vector width double:			 1
  Max clock frequency:				 1300Mhz
  Address bits:					 64
  Max memory allocation:			 2645975960
  Image support:				 Yes
  Max number of images read arguments:		 128
  Max number of images write arguments:		 8
  Max image 2D width:				 16384
  Max image 2D height:				 16384
  Max image 3D width:				 16384
  Max image 3D height:				 16384
  Max image 3D depth:				 8192
  Max samplers within kernel:			 5592
  Max size of kernel argument:			 1024
  Alignment (bits) of base address:		 1024
  Minimum alignment (bytes) for any datatype:	 128
  Single precision floating point capability
    Denorms:					 Yes
    Quiet NaNs:					 Yes
    Round to nearest even:			 Yes
    Round to zero:				 Yes
    Round to +ve and infinity:			 Yes
    IEEE754-2008 fused multiply-add:		 Yes
  Cache type:					 Read/Write
  Cache line size:				 64
  Cache size:					 16384
  Global memory size:				 3112912896
  Constant buffer size:				 2645975960
  Max number of constant args:			 8
  Local memory type:				 Scratchpad
  Local memory size:				 65536
  Max pipe arguments:				 16
  Max pipe active reservations:			 16
  Max pipe packet size:				 2645975960
  Max global variable size:			 2645975960
  Max global variable preferred total size:	 3112912896
  Max read/write image args:			 64
  Max on device events:				 1024
  Queue on device max size:			 8388608
  Max on device queues:				 1
  Queue on device preferred size:		 262144
  SVM capabilities:				 
    Coarse grain buffer:			 Yes
    Fine grain buffer:				 Yes
    Fine grain system:				 Yes
    Atomics:					 No
  Preferred platform atomic alignment:		 0
  Preferred global atomic alignment:		 0
  Preferred local atomic alignment:		 0
  Kernel Preferred work group size multiple:	 64
  Error correction support:			 0
  Unified memory for Host and Device:		 1
  Profiling timer resolution:			 1
  Device endianess:				 Little
  Available:					 Yes
  Compiler available:				 Yes
  Execution capabilities:				 
    Execute OpenCL kernels:			 Yes
    Execute native function:			 No
  Queue on Host properties:				 
    Out-of-Order:				 No
    Profiling :					 Yes
  Queue on Device properties:				 
    Out-of-Order:				 Yes
    Profiling :					 Yes
  Platform ID:					 0x7ff14da9ccf0
  Name:						 gfx902+xnack
  Vendor:					 Advanced Micro Devices, Inc.
  Device OpenCL C version:			 OpenCL C 2.0 
  Driver version:				 3212.0 (HSA1.1,LC)
  Profile:					 FULL_PROFILE
  Version:					 OpenCL 2.0 
  Extensions:					 cl_khr_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_fp16 cl_khr_gl_sharing cl_amd_device_attribute_query cl_amd_media_ops cl_amd_media_ops2 cl_khr_image2d_from_buffer cl_khr_subgroups cl_khr_depth_images cl_amd_copy_buffer_p2p cl_amd_assembly_program 
```
</div>
</details>

####6) PATH の登録

```
echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/rocprofiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh
```

##5．　参考URL
この３つがインストールに役立った。ネガティブな情報は割愛。なお、更新が早いので、情報が古くなっても文句を言わないこと。

[1：AMD APU への ROCm のインストール](https://bruhnspace.com/en/bruhnspace-rocm-for-amd-apus/)
[2：HWEの確認方法](https://www.linuxuprising.com/2019/02/how-to-install-ubuntu-18042-lts.html)
[3：ROCm 4.0 のインストール](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html)