Help us understand the problem. What is going on with this article?

Radeon RX 570でROCmを使えるようにする

ROCmを有効にしてPyTorchをCMAKEする

環境

OS : Ubuntu-server-18.04
CPU :  AMD Ryzen 7 3700X
GPU : Radeon RX 470
メモリ: 16Gb

カーネルの更新

$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt install --install-recommends linux-generic-hwe-18.04 xserver-xorg-hwe-18.04
$ sudo reboot

Ubuntu18ではカーネルが5である必要があるため最初にカーネルを更新します。

$ uname -a
Linux ryzen 5.3.0-40-generic #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ドライバのインストール

$ wget https://drivers.amd.com/drivers/linux/19.50/amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz
$ tar Jxvf amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz
$ ./amdgpu-pro-19.50-967956-ubuntu-18.04/amdgpu-install --headless --no-dkms --no-32

ubuntuサーバなのとあとからROCmのランタイムを入れるため上記のオプションにしています。

開発ツールとROCmライブラリのインストール

$ curl -fsSL http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key | sudo apt-key add -
$ sudo sh -c 'echo deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main > /etc/apt/sources.list.d/rocm.list'
$ sudo apt update

$ sudo apt-get install -y --no-install-recommends \
    sudo \
    libelf1 \
    build-essential \
    bzip2 \
    ca-certificates \
    cmake \
    ccache \
    ssh \
    apt-utils \
    pkg-config \
    g++-multilib \
    gdb \
    git \
    less \
    libunwind-dev \
    libfftw3-dev \
    libelf-dev \
    libncurses5-dev \
    libomp-dev \
    libpthread-stubs0-dev \
    make \
    miopen-hip \
    python3-dev \
    python3-future \
    python3-yaml \
    python3-pip \
    libssl-dev \
    libboost-dev \
    libboost-system-dev \
    libboost-filesystem-dev \
    libopenblas-dev \
    rpm \
    net-tools \
    iputils-ping \
    libnuma-dev \
    rccl \
    rocm-dev \
    rocm-profiler \
    roctracer-dev \
    rocrand \
    rocblas \
    rocfft \
    hipcub \
    rocthrust \
    hipsparse

全ユーザーで python を python3 として動くように

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
$ sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 2

ROCm ランタイムライブラリのインストール

$ sudo apt-get install -y --no-install-recommends rocm-dkms
$ sudo usermod -a -G video $LOGNAME

$ echo 'ADD_EXTRA_GROUPS=1' | sudo tee -a /etc/adduser.conf
$ echo 'EXTRA_GROUPS=video' | sudo tee -a /etc/adduser.conf

$ sudo reboot

fix capitalization in some cmake files...

$ sudo sed -i 's/find_dependency(hip)/find_dependency(HIP)/g' /opt/rocm/rocsparse/lib/cmake/rocsparse/rocsparse-config.cmake
$ sudo sed -i 's/find_dependency(hip)/find_dependency(HIP)/g' /opt/rocm/rocfft/lib/cmake/rocfft/rocfft-config.cmake
$ sudo sed -i 's/find_dependency(hip)/find_dependency(HIP)/g' /opt/rocm/miopen/lib/cmake/miopen/miopen-config.cmake
$ sudo sed -i 's/find_dependency(hip)/find_dependency(HIP)/g' /opt/rocm/rocblas/lib/cmake/rocblas/rocblas-config.cmake

python で作られたビルドツールで使われているモジュールのインストール

$ pip install setuptools numpy scipy typing enum34 hypothesis

環境変数の設定

.bashrc
#
# ROCm関連設定
#
export PATH=$PATH:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin/x86_64
export RCCL_DIR=/opt/rocm/rccl/lib/cmake/rccl
export hip_DIR=/opt/rocm/hip/cmake
export HIP_PLATFORM='hcc'
export LC_ALL='en_US.UTF-8'
export LC_CTYPE='en_US.UTF-8'
export PYTORCH_ROCM_ARCH='gfx803'
$ source ~/.bashrc

PyTorchのインストール

$ git clone --recursive -b v1.4.0 https://github.com/pytorch/pytorch.git
$ cd pytorch/
$ ./tools/amd_build/build_amd.py
$ mkdir build
$ cd build
$ cmake \
    -DBUILD_PYTHON=OFF \
    -DBUILD_CAFFE2_OPS=OFF \
    -DBUILD_CAFFE2_MOBILE=OFF \
    -DUSE_CUDA=OFF \
    -DUSE_ROCM=ON \
    -DBUILD_TEST=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    ..
$ make -j 12
$ sudo make -j 12 install

makeにすべての16スレッドを使うとソース生成部分でエラーになるので少なめを指定したほうが安全

動作確認

sample /
    CMakeLists.txt
    main.cc
CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

project(torch-sample)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Torch REQUIRED)

# 任意の場所にインストールした場合
# find_package(Torch REQUIRED PATHS ${TORCH_INSTALL_PREFIX}/lib)

add_executable(sample-bin ${CMAKE_CURRENT_SOURCE_DIR}/main.cc)
target_link_libraries(sample-bin ${TORCH_LIBRARIES})
set_target_properties(sample-bin PROPERTIES OUTPUT_NAME sample)
main.cc
#include <iostream>
#include <torch/script.h>

int main(int argc, char **argv)
{
    torch::DeviceType device_type = torch::kCUDA;
    torch::Device device(device_type);

    torch::Tensor tensor = torch::ones({2, 3}, device);
    std::cout << tensor << std::endl;

    return 0;
}
$ mkdir build
$ cd build
$ make -j
$ ./sample
 1  1  1
 1  1  1
[ CUDAFloatType{2,3} ]

付録

LLVM C-langのインストール

ひょっとしたら必須かも多分、任意

$ curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
$ sudo sh -c 'echo deb [arch=amd64] http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main > /etc/apt/sources.list.d/llvm10.list'
$ sudo sh -c 'echo deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main >> /etc/apt/sources.list.d/llvm10.list'
$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends clang-10

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/clang-10 5
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/clang++-10 5

ドライバの確認

$ /opt/rocm/bin/rocminfo
        :
    N/A
*******
Agent 2
*******
  Name:                    gfx803
  Marketing Name:          Ellesmere [Radeon RX 470/480/570/570X/580/580X]
  Vendor Name:             AMD
  Feature:                 KERNEL_DISPATCH
        :

中央部部に表示されるGPUの識別名を環境変数 PYTORCH_ROCM_ARCH へセットする

/opt/rocm/bin/rocm-smi
========================ROCm System Management Interface========================
================================================================================
GPU  Temp   AvgPwr   SCLK    MCLK    Fan     Perf  PwrCap  VRAM%  GPU%
0    34.0c  33.095W  300Mhz  300Mhz  23.92%  auto  120.0W    0%   0%
================================================================================
==============================End of ROCm SMI Log ==============================

Pythonのsetup.py でインストール

$ pip install wheel
$ BUILD_CAFFE2_OPS=0 python setup.py bdist_wheel

スレッド数を指定する時は上限を指定しない方がよい様です。

感想

とにかくコンパイルに時間がかかります。
SSDに展開しているはずですが、メモリ足らない?
Juman++をコンパイルした場合、Ryzen7(3700X)はとんでもなく早かったです。
Intel i7 の第6世代と比べた場合です。

BUILD_CAFFE2_OPS を有効にするとエラーでわからんでした。
とりあえず libtorch が動くまでをアップしました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした