Note to Self by notekunst

ただの備忘録です

Ubuntu 上での Android のビルド環境の構築

Ubuntu の 20.04 のパーティションを消去して 22.04 を新たにインストールしたので、ビルド環境を新たに構築し直しました。私は主に LineageOS をビルドする予定なので、LineageOS Wiki の以下の記事を参考にしました。
https://wiki.lineageos.org/devices/pro1/build
この記事は F(x)tec pro1 というモデルのためのものですが、ビルド環境は、モデル等には関係なく、いろいろな種類の Android をビルドできます。
以下、構築作業の記録です。

SDK Platform Tools (adb, fastboot) のインストール

android.com の以下のウェブページから Linux 用の SDK Platform Tools をダウンロードします。
https://developer.android.com/studio/releases/platform-tools
ダウンロードした zip データを適当なディレクトリで展開して終了です。
.bashrc, .profile などでパスを通してもよいです。

USB (udev) の設定

PC から adb や fastboot でデバイスと通信するための設定を行います(ワイヤレスではなく、USB 有線を想定してます)。
android.com の以下の記事が参考になります。
https://developer.android.com/studio/run/device
まず、adb を使用するユーザが plugdev というグループに入っていることを確認します。
id コマンドを実行すれば、現行ユーザの uid, gid, groups が表示されます。
もし groups に plugdev が無い場合、ユーザを plugdev に追加します。

$ sudo usermod -aG plugdev $LOGNAME
(現行ユーザが plugdev に追加されます)

グループ変更は、ログインのし直しによって、反映されます。

次に udev のルールを追加します。先の記事(https://developer.android.com/studio/run/device)にあるように、パッケージインストールが便利です。

$ sudo apt-get install android-sdk-platform-tools-common

これで、/lib/udev/rules.d/51-android.rules がインストールされます。このファイルには、様々なデバイスのルールが設定されています。

自分でルールを設定することも可能です。
/etc/udev/rules.d/51-android.rules にルールを追加します。

# F(x)tec pro1, Unihertz AtomL, jelly2
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
# Unihertz AtomL, jelly2
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"

この設定例で、F(x)tec pro1 と Unihertz AtomL, jelly2 を接続できました。
ATTR{idVendor} にはデバイスのベンダーID を設定します。デバイスを usb に接続し、PC 上で lsusb コマンドを実行すれば、ベンダーID を確認できます。

$ lsusb
Bus 002 Device 040: ID 0e8d:2008 MediaTek Inc. ...
(ID に続く4桁の番号(0e8d)がベンダーIDです)

recovery, fastboot などのデバイスの状態によって ID が変わる場合があります。
パーミッション(MODE)は、"0666" でなく "0660" でいいかもしれません。パッケージインストールの 51-android.rules では、"0660" となっています。

ルール設定が済んだら、デバイスの "USB debugging" を有効にして PC に接続してみます。PC 上で "adb devices" を実行し、デバイスが表示されたら OK です。
adb と fastboot については、android.com の以下の記事が参考になります。
https://source.android.com/devices/bootloader/fastbootd

ビルドバッケージのインストール

LineageOS Wiki の先の記事(https://wiki.lineageos.org/devices/pro1/build)を参考に、ビルドに必要なパッケージをインストールします。

$ sudo apt insatll bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

repo コマンドのインストール

android.com の以下の記事が参考になります。
https://source.android.com/setup/develop#installing-repo
私はパッケージを用いずに手動でインストールしました。

$ export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
$ curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
$ gpg --recv-key 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
$ curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

LineageOS Wiki の先の記事にあるように、.bashrc, .profile などで ~/bin をパスに追加すると便利です。

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

git の設定

repo が Android を同期するために身元確認を必要とするので、git の識別情報を設定します。

$ git config --global user.email "you@example.com"   (you@example.comは、実際には自分のメールアドレス)
$ git config --global user.name "Your Name"   (Your Nameは、実際には自分の名前)

ccache の有効化

ccache を有効にすれば、2回目以降のビルドを高速化できます。.bashrc, .profile などで設定します。

export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

キャッシュのサイズを 50GB に設定しました。

$ ccache -M 50G

ccache -s -v を実行すれば、キャッシュの状態を出力できます。

$ ccache -s  -v
Summary:
  Cache directory:            /home/XXXXXXX/.cache/ccache      ( XXXXXXXはユーザ名)
  Primary config:             /home/XXXXXXX/.config/ccache/ccache.conf
  Secondary config:           /etc/ccache.conf
  Stats updated:              Tue Jul 26 13:45:58 2022
  Hits:                        8772 /  52046 (16.85 %)
    Direct:                     754 /  52047 (1.45 %)
    Preprocessed:              8018 /  51292 (15.63 %)
  Misses:                     43274
    Direct:                   51293
    Preprocessed:             43274
  Uncacheable:                   19
Primary storage:
  Hits:                        9526 / 104093 (9.15 %)
  Misses:                     94567
  Cache size (GB):             5.26 /  50.00 (10.51 %)
  Files:                      94121
Uncacheable:
  Called for preprocessing:      18
  Unsupported code directive:     1

私の場合、ビルドを開始すると、何故か /home/XXXXXXX/.cache/ccache という空ファイルが作成されてしまい、"ccache はディレクトリでない" というエラーが発生しました。空ファイル "/home/XXXXXXX/.cache/ccache" を手動で削除し、ディレクトリ "/home/XXXXXXX/.cache/ccache" を手動で作成したら、ビルドがうまく進行しました。

swap 領域の拡張

LineageOS GSI をビルドしようとしたところ、out/soong/.bootstrap/bin/soong_build out/soong/build.ninja の処理でプロセスが kill されました。16G RAM + 2G swap では足りないようです。そこで、swap 領域を拡張します。

$ free -h                          # スワップのサイズを確認
$ sudo swapon -s                   # swapがファイル(/swapfile)であることを確認
$ sudo swapoff /swapfile           # スワップを解除
$ sudo rm /swapfile                # スワップファイルを削除
$ sudo fallocate -l 16G /swapfile  # スワップ用に16GBの新ファイル (/swapfile) を作成
$ sudo chmod go= /swapfile         # 新ファイルの余計な権限を削除
$ sudo mkswap /swapfile            # 新ファイルをスワップファイルに変換
$ sudo swapon /swapfile            # スワップファイルを有効化
$ free -h                          # スワップのサイズを確認 

LineageOS GSI を再びビルドしたところ、成功しました。out/soong/.bootstrap/bin/soong_build out/soong/build.ninja の処理で、7G ほど swap 領域が使用されていました。

以上で、ビルド環境が構築されました。

古いGPU(CUDA CC=3.0)のためのTorchaudioのビルド(Ubuntu 22.04 on MacBookPro 15" Late2013)

以下の組み合わせで、一部の機能が、一応、動くようになりました。

GPU GeForce GT 750M (Compute Capability 3.0)
Display Driver 418.113 (nvidia-smiによると470.129.06)
CUDA 10.2
cuDNN 7.6.5
pytorch 1.9.1
torchvision 0.10.1
torchaudio 0.9.1

torchvision v0.10.1 に続いて、torchaudio v0.9.1 をビルドしました。以下、ビルド作業の記録です。

torchaudio v0.9.1 のビルドの手順

v0.9.1 の README.md にビルドの手順が記載されています。
https://github.com/pytorch/audio/tree/v0.9.1
これを参照して、ビルドを進めます。

ソースコードのダウンロード

適当なディレクトリを作成して、ソースコードをダウンロードします。

git clone --depth 1 --recursive https://github.com/pytorch/audio -b v0.9.1

ビルド

v0.9.1 の README.md (https://github.com/pytorch/audio/tree/v0.9.1) を参照しつつ、ビルドを進めます。念のために pytorch のビルドの設定と同じ設定にしました。

$ export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
$ export USE_CUDA=1 USE_CUDNN=1 TORCH_CUDA_ARCH_LIST="3.0"
$ export MAX_JOBS=2  (任意)
$ BUILD_SOX=1 python setup.py install

"BUILD_SOX=1" を忘れないようにします。
これで、ビルド、インストールが完了しました。

テスト

torchaudio のソースコードの audio/test/ には、テスト用のスクリプトがあります。torchaudio の以下の記事には、テスト方法の説明があります。
https://github.com/pytorch/audio/tree/v0.9.1/test/torchaudio_unittest
以下のコマンドにより、複数のテストが順番に行われます。

$ pytest audio/test

試してみたところ、こんな結果になりました。
= 1098 failed, 2977 passed, 1657 skipped, 4 xfailed, 171 warnings in 2416.05s (0:40:16) =

以下のファイルは、ファイル名とタイムスタンプとから、先ほどのテストの失敗の記録と思われます。
audio/.pytest_cache/v/cache/lastfailed
ファイルの中を見てみると、MockedLoadTestのエラーとMockedSaveTestのエラーがほとんどでした。これらのエラーは、計算自体には影響ないと思います。気になるエラーは、autograd_cuda_test.pyのエラーです。

テストを行って結果を見てみます。

pytest audio/test/torchaudio_unittest/transforms/autograd_cuda_test.py

"CUDA out of memory"のエラーが発生していました(これは、仕方ないです・・・)

いろいろな計算で遊ぶには、十分な気もします。

古いGPU(CUDA CC=3.0)のためのTorchvisonのビルド(Ubuntu 22.04 on MacBookPro 15" Late2013)

以下の組み合わせで、一部の機能が、一応、動くようになりました。

GPU GeForce GT 750M (Compute Capability 3.0)
Display Driver 418.113 (nvidia-smiによると470.129.06)
CUDA 10.2
cuDNN 7.6.5
pytorch 1.9.1
torchvision 0.10.1
torchaudio 0.9.1

pytorch v1.9.1 に続いて、torchvision v0.10.1 をビルドしました。以下、ビルド作業の記録です。

torchvision v0.10.1 のビルドの手順

v0.10.1 の README.md にビルドの手順が記載されています。
https://github.com/pytorch/vision/tree/v0.10.1
これを参照して、ビルドを進めます。

ソースコードのダウンロード

適当なディレクトリを作成して、ソースコードをダウンロードします。

git clone --depth 1 --recursive https://github.com/pytorch/vision -b v0.10.1

ビルド

v0.10.1 の README.md (https://github.com/pytorch/vision/tree/v0.10.1) を参照しつつ、ビルドを進めます。念のために pytorch のビルドの設定と同じ設定にしました。

$ conda install libpng jpeg
$ export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
$ export USE_CUDA=1 USE_CUDNN=1 TORCH_CUDA_ARCH_LIST="3.0" 
$ export MAX_JOBS=2  (任意)
$ python setup.py install

これで、ビルド、インストールが完了しました。

テスト

torchvision のソースコードvision/test/ には、テスト用のスクリプトがあります。torchvision の以下の記事には、テスト方法の説明があります。
https://github.com/pytorch/vision/blob/v0.10.1/CONTRIBUTING.md#unit-tests=

以下のコマンドにより、複数のテストが順番に行われます。

$ pytest vision/test -vvv

試してみたところ、こんな結果になりました。
= 25 failed, 2233 passed, 108 skipped, 6 xfailed, 1545405 warnings in 783.64s (0:13:03) =

以下のファイルは、ファイル名とタイムスタンプとから、先ほどのテストの失敗の記録と思われます。
vision/.pytest_cache/v/cache/lastfailed
ファイルの中を見てみると、データダウンロードに関するエラー以外に、以下のテストのエラーがありました。

  • test_models.py
  • test_ops.py
  • test_transforms.py

個々にテストを行って結果を見てみます。

$ python vision/test/test_models.py

"CUDA out of memory"のエラーが発生していました(これは、仕方ないです・・・)

$ python vision/test/test_ops.py
Ran 66 tests in 229.388s
OK

なぜか、エラーは出ませんでした。

$ python vision/test/test_transforms.py
...
FAIL: test_adjust_gamma (__main__.Tester)

torchvision.transforms.functional.adjust_gamma の計算にエラーがあるようです。
test_transforms.py の test_adjust_gamma を見てみます。

    def test_adjust_gamma(self):
        x_shape = [2, 2, 3]
        x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1]
        x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape)
        x_pil = Image.fromarray(x_np, mode='RGB')

        # test 0
        y_pil = F.adjust_gamma(x_pil, 1)
        y_np = np.array(y_pil)
        torch.testing.assert_close(y_np, x_np)

        # test 1
        y_pil = F.adjust_gamma(x_pil, 0.5)
        y_np = np.array(y_pil)
        y_ans = [0, 35, 57, 117, 186, 241, 97, 45, 245, 152, 255, 16]
        y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape)
        torch.testing.assert_close(y_np, y_ans)

       # test 2
        y_pil = F.adjust_gamma(x_pil, 2)
        y_np = np.array(y_pil)
        y_ans = [0, 0, 0, 11, 71, 201, 5, 0, 215, 31, 255, 0]
        y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape)
        torch.testing.assert_close(y_np, y_ans)

定義済の x_data に対応する x_np と、ガンマ補正(ガンマ=1)を行って得られる y_np を比較してます。また、y_np と定義済の y_ans を比較しています。ガンマ=1なので、比較結果は一致するはずです。python 上で計算を追いかけてみます。

>>> x_shape = [2, 2, 3]
>>> x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1]
>>> x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape)
>>> x_pil = Image.fromarray(x_np, mode='RGB')
>>> y_pil = F.adjust_gamma(x_pil, 1)
>>> y_np = np.array(y_pil)
>>> x_np
array([[[  0,   5,  13],
        [ 54, 135, 226]],
       [[ 37,   8, 234],
        [ 90, 255,   1]]], dtype=uint8)
>>> y_np
array([[[  0,   5,  13],
        [ 54, 136, 227]],
       [[ 37,   8, 235],
        [ 90, 255,   1]]], dtype=uint8)

x_np と y_np との間で、いくつかの要素の値が1ずれてます。
さらに続けます。

>>> y_pil = F.adjust_gamma(x_pil, 0.5)
>>> y_np = np.array(y_pil)
>>> y_ans = [0, 35, 57, 117, 186, 241, 97, 45, 245, 152, 255, 16]
>>> y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape)
>>> y_np
array([[[  0,  36,  58],
        [118, 186, 241]],
       [[ 98,  45, 245],
        [152, 255,  16]]], dtype=uint8)
>>> y_ans
array([[[  0,  35,  57],
        [117, 186, 241]],
       [[ 97,  45, 245],
        [152, 255,  16]]], dtype=uint8)

y_np と y_ans との間で、いくつかの要素の値が1ずれてます。
さらに続けます。

>>> y_pil = F.adjust_gamma(x_pil, 2)
>>> y_np = np.array(y_pil)
>>> y_ans = [0, 0, 0, 11, 71, 201, 5, 0, 215, 31, 255, 0]
>>> y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape)
>>> y_np
array([[[  0,   0,   1],
        [ 11,  72, 201]],
       [[  5,   0, 216],
        [ 32, 255,   0]]], dtype=uint8)
>>> y_ans
array([[[  0,   0,   0],
        [ 11,  71, 201]],
       [[  5,   0, 215],
        [ 31, 255,   0]]], dtype=uint8)

y_np と y_ans との間で、いくつかの要素の値が1ずれてます。
大間違いはしていませんが、少し残念です。
ソースコードの 関連部分も見ましたが、シンプルに計算してるだけのように見えました(vision/torchvision/transforms/ の functional.py, functional_pil.py, functional_tensor.py)。現時点で、不一致の原因はわかっていません。

いろいろな計算で遊ぶには、十分な気もします。

古いGPU(CUDA CC=3.0)のためのPyTorchのビルド(Ubuntu 22.04 on MacBookPro 15" Late2013)

CUDA, cuDNN, pytorch のいろいろなバージョンの組み合わせを試してみました。
以下の組み合わせで、一部の機能が、一応、動くようになりました。

GPU GeForce GT 750M (Compute Capability 3.0)
Display Driver 418.113 (nvidia-smiによると470.129.06)
CUDA 10.2
cuDNN 7.6.5
pytorch 1.9.1
torchvision 0.10.1
torchaudio 0.9.1

pytorch v0.3.1 のリリースノートには、以下の説明があります。
「バイナリから CUDA capability 3.0 と 5.0 のサポートが削除されました(今のところソースからビルドすれば動作しますが、今後のサポートは削除されます)」
https://github.com/pytorch/pytorch/releases?page=3
できるだけ新しい pytorch を使いたかったので、現時点の最新版(v1.12.0)から遡りつつ順番にビルドしてみました。
v1.12.0 から v1.10.2 までは、 GPU の機能不足("__funnelshift_r"が無いなど)により、ビルドできませんでした。
v1.9.1 は、ソースコードを修正して、なんとかビルドに成功しました。
以下、ビルド作業の記録です。

pytorch v1.9.1 のビルドの手順

v1.9.1 の README.md の "From Source"にビルドの手順が記載されています。
https://github.com/pytorch/pytorch/tree/v1.9.1#from-source
これを参照して、ビルドを進めます。

ソースコードのダウンロード

適当なディレクトリを作成して、ソースコードをダウンロードします。

git clone --depth 1 --recursive https://github.com/pytorch/pytorch -b v1.9.1

ソースコードの修正

以下の3項目を修正しました。
(1) torch/utils/cpp_extension.py の修正
(2) MAGMA initialization のバグフィックス
(3) テスト用のデータの URL の修正

torch/utils/cpp_extension.py の修正

torch/utils/cpp_extension.py に '3.0' を追加する修正を行います。以下の下線部を追加しました。

    named_arches = collections.OrderedDict([
        ('Kepler+Tesla', '3.7'),
        ('Kepler', '3.0;3.5+PTX'),
...
    supported_arches = ['3.0','3.5', ...
MAGMA initialization のバグフィックス

v1.9.1 には、MAGMAの初期化に失敗するバグがあります。v1.10.0 には、このバグフィックスが取り込まれました。以下のコミットを参照して、同じようにソースコードを修正します。
https://github.com/pytorch/pytorch/commit/296d2a4399923370dccc5f3f4fc0f5fd12db4d19
このバグフィックスでは、以下の4つファイルが修正されます。
(1) aten/src/THC/CMakeLists.txt
(2) aten/src/THC/THCTensorMathMagma.cu -> .cpp
(3) aten/src/THC/THCTensorMathMagma.cuh -> .h
(4) aten/src/THC/generic/THCTensorMathMagma.cu -> .cpp
(2) (3) (4)のファイルの拡張子が変更され、(1) (2) (4)のファイル内容が修正されます。
大規模な修正ではなかったので、手作業でソースコードを修正しました。

テスト用のデータの URL の修正

torch/testing/_internal/common_utils.py に記載されている2つの url を以下のように修正します。

...
#url = "https://raw.githubusercontent.com/pytorch/test-infra/master/stats/slow-tests.json"(旧URLをコメントアウト)
 url = "https://raw.githubusercontent.com/pytorch/test-infra/generated-stats/stats/slow-tests.json"(新URLに設定)
...
#url = 'https://raw.githubusercontent.com/pytorch/test-infra/master/stats/disabled-tests.json'(旧URLをコメントアウト)
 url = 'https://raw.githubusercontent.com/pytorch/test-infra/generated-stats/stats/disabled-tests.json'(新URLに設定)

これらの url は、ビルド後のテストで参照するデータを示しています。

conda の仮想環境の作成

私は conda の仮想環境下でビルドを進めました。まず、pytorch 用の仮想環境を作成します(以下のXXXXXは、任意の仮想環境名です)。

$ conda create -n XXXXX python=3.8 setuptools=58.0.4
$ conda activate XXXXX

setuptools=58.0.4 を指定する理由は、ビルド時の以下のエラーを避けるためです。
「AttributeError: module 'distutils' has no attribute 'version'」
ネットで調べると、このエラーは、setuptools が新しい場合に発生し、setuptools のバージョンを 59.5.0 までダウングレードすればエラーが解消するようです。conda search setuptools で検索したところ、59.5.0 は見つかりませんが 58.0.4 が見つかりました。そこで、setuptools=58.0.4 を指定しました。

ビルドの準備

v1.9.1 の README.md (https://github.com/pytorch/pytorch/tree/v1.9.1#from-source) の "From Source" を参照しつつ、準備を進めます。

$ conda install astunparse numpy ninja pyyaml mkl mkl-include cmake cffi typing_extensions future six requests dataclasses   (ここで、setuptools を省略します)
$ conda install -c pytorch magma-cuda102
$ conda install typing pytest scipy parameterized hypothesis pillow
$ export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
$ export USE_CUDA=1 USE_CUDNN=1 TORCH_CUDA_ARCH_LIST="3.0" 

ここで setuptools が更新されないように気をつけます。

TORCH_CUDA_ARCH_LIST には "3.0" を設定します。

追加のツール typing, pytest, scipy, parameterized, hypothesis, pillow のインストールは、pytorch, torchvision, torchaudio のテストのためです。scipy をインストールすると、blas, intel-openmp, libgfortran-ng, mkl, numpy, numpy-base がダウングレードされてしまいます。pytorch のビルドの後にダウングレードが生じると、pytorch の再ビルドが必要になるので、ビルドの前にインストールします。

ビルド開始

ビルドには、数時間かかります。時間に余裕がある場合、"MAX_JOBS" を設定してスレッド数を少なくするといいかもしれません(MacBookPro 15" Late 2013では、最大は 8 です)。ビルド時間が更に長くなりますが、長時間の発熱によるダメージは軽減されると思います。

$ export MAX_JOBS=2  (任意)
$ python setup.py install

これで、ビルド、インストールが完了しました。

テスト

pytorch のソースコードの pytorch/test/ には、テスト用のスクリプトがあります。pytorch の以下の記事には、テスト方法の説明があります。
https://github.com/pytorch/pytorch/blob/v1.9.1/CONTRIBUTING.md#unit-testing=
"test_"で始まるファイルのそれぞれが、テスト用のスクリプトです。

以下のコマンドにより、複数のテストが順番に行われます。

$ python pytorch/test/run_test.py

以下のように1つのテストを実行することもできます。

$ python pytorch/test/test_cuda.py

run_test.py では、変数 TESTS にテストのリストが設定されています。沢山のテストが準備されています。テストの実行には、かなり時間がかかります。エラーが発生すると、そこでテストが中断します。私は、完了したテストとエラーのあるテストをコメントアウトして、続きのテストを進行しました。例えば、以下のように最初の'test_import_time'から'test_cuda'までをコメントアウトすれば、'test_jit_cuda_fuser'からテストを開始できます。

TESTS = [
#    'test_import_time',
#    'test_public_bindings',
...
#    'distributed/test_c10d_spawn_nccl',
#    'test_cuda',
    'test_jit_cuda_fuser',
...

現時点でのテスト結果は、こんな感じです

from "test_import_time" to "distributed/test_c10d_spawn_nccl" OK
"test_cuda" CUDA out of memory
"test_jit_cuda_fuser" a PTX JIT compilation failed
from "test_cuda_primary_ctx" to "distributions/test_constraints" OK
"distributions/test_distributions" ValueError (relative tolerance)
from "test_dispatch" to "test_foreach" OK
"test_indexing" CUDA out of memory
"test_jit" "__ldg" is undefined
"test_linalg" CUDA out of memory, no kernel image is available
from "test_logging" to "test_numba_integration" OK
"test_nn" CUDA out of memory, "__ldg" is undefined

テストに時間がかかるので、一部の項目しか確認できていません。
これらの結果を簡単に検討してみました。

  • "CUDA out of memory" については、仕方ないと思います(本機の GPU メモリは 2GB なので)。
  • JIT のエラーについては、要検討です。
  • "__ldg" は Capability 3.0 には無い機能なので、仕方ないと思います。"__ldg" を従来の関数を用いて定義し直せば、エラーを解消できるかもしれません。
  • "distributions/test_distributions"の計算エラーについては、要検討です。ネットで検索すると、scipy のバージョンを変えたらテスト結果が変わる、という話を見つけました。https://github.com/pytorch/pytorch/issues/60347 これが今回の件に当てはまるのか、未確認です。
  • "test_linalg" の "no kernel image is available" については、エラーメッセージで指摘された関数(torch.linalg.cond など)のサンプルコードを実行したところ、正常に動作しました。エラーの原因は linalg の関数とは別のところにあるのかもしれません。なお、linalg のサンプルコードは、pytorch のドキュメントの各関数のページにあります。https://pytorch.org/docs/1.9.1/linalg.html


未確認の多数のテストが残っていますが、それらについては、またそのうちに・・・。

とりあえず、"__ldg"、JITなどの一部の機能を用いなければ、いろいろな計算で遊べると思います。

CUDA, cuDNNをアップデート(Ubuntu 22.04 on MacBookPro 15" Late 2013)

PyTorch の新しいバージョンを試すために CUDA のバージョンを 10.1 から 10.2 にアップデートしました。現時点の構成は以下の通りです。

GPU GeForce GT 750M (compute capability 3.0)
Display Driver 418.113 (nvidia-smiによると470.129.06)
CUDA 10.2
cuDNN 7.6.5
gcc, g++ 8.5

以下、アップデート作業の記録です。

CUDA のアップデート

Nvidiaの以下のウェブサイトから、CUDA 10.2 のパッケージをダウンロードします。
https://developer.nvidia.com/cuda-toolkit-archive/
私は、"CUDA Toolkit 10.2 (Nov 2019)"から先に進み、"Linux", "x86_64", "Ubuntu", "18.04", "deb (local)"を選択しました。ここで、以下の4個のデータをダウンロードします。

  • cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
  • cuda-repo-ubuntu1804-10-2-local-p1-_10.2.1-1_amd64.deb
  • cuda-repo-ubuntu1804-10-2-local-p2-_10.2.2-1_amd64.deb
  • cuda-ubuntu1804.pin

インストールの前に古い CUDA, cuDNN を削除します。

$ sudo apt remove --purge '*cudnn*'
$ sudo apt remove --purge '*cuda*'
$ sudo apt autoremove
$ sudo apt autoclean
$ sudo reboot

インストール作業を進めます。Display Driver の更新は不要なので、"sudo apt-get -y install cuda"の代わりに"sudo apt-get -y install cuda-toolkit-10-2"を実行します。

$ sudo cp cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-10-2
$ sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-p1-_10.2.1-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-p2-_10.2.2-1_amd64.deb

".bashrc" などのパス設定を確認します。

export CUDA_PATH=/usr/local/cuda
export PATH="$PATH:/usr/local/cuda/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"

nvcc -V を実行すると、バージョン等が表示されます。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

CUDA のサンプルプログラムをコピーして make、実行してみます。

$ cuda-install-samples-10.2.sh ./

サンプルのコンパイルには、gcc-8 シリーズが必要です。gcc-8.5 のインストール作業は、以下の記事にあります。
Nvidia Driver, CUDA, cuDNN, gcc, g++のインストール(Ubuntu 22.04 on MacBookPro 15" Late 2013) - Note to Self by notekunst

cuDNN のアップデート

Nvidia の以下のページから、cuDNN 7.6.5 のパッケージをダウンロードします。メンバー登録が必要です。
https://developer.nvidia.com/rdp/cudnn-download
CUDA 10.2 用の cuDNN 7.6.5 の3つのファイルをダウンロードします。

  • libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
  • libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
  • libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb

インストール作業を進めます。

$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb

cuDNN のサンプルプログラムをコピーして make、実行してみます。

$ cp -r /usr/src/cudnn_samples_v7 ./

以下のツールをインストールすると、CUDA, cuDNN のいろいろなサンプルをコンパイルできます。

$ sudo apt install libvulkan1 libvulkan-dev vulkan-tools
$ sudo apt install libglfw3 libglfw3-dev libglfw3-doc

CUDA, cuDNN のいろいろなサンプルがうまく動作しました。
次は、PyTorch を試そうと思います。

Nvidia Driver, CUDA, cuDNN, gcc, g++のインストール(Ubuntu 22.04 on MacBookPro 15" Late 2013)

CUDA と cuDNN の適切なバージョンは GPU に応じて異なります。私の MacBookPro の GPUGeForce GT 750M)のアーキテクチャは Kepler で、Compute Capability は3.0です。この GPU を用いる試行錯誤の結果、以下の組み合わせを採用しました。

Display Driver 418.113
CUDA 10.1
cuDNN 7.6.5
gcc, g++ 8.5

以下、インストール作業の記録です。

Display Driver

ubuntu 22.04 のインストール時に"Install third-party..."をチェックしたからか、最初から以下のドライバが使用可能でした。

  • nvidia-driver-390 (proprietary, tested)
  • nvidia-driver-418-server (proprietary)

しかし、これらを使用する状態で CUDA をインストールする場合、nvidia-smi は GPU を認識できますが、CUDA のサンプルプログラムは GPU を認識できませんでした。そこで、Display Driver を入れ直します。

Nvidiaの以下のウェブサイトで "GeForce GT 750M"、"Linux 64-bit" に適するドライバのバージョンを確認します。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp
以下の結果が得られました。

バージョン: 	418.113
リリース日: 	2019.11.5
オペレーティングシステム: 	Linux 64-bit
言語: 	Japanese
ファイルサイズ: 	104.78 MB 

このウェブページからドライバのインストーラをダウンロード可能ですが、このインストーラを実行しても、インストールに失敗しました(Linuxカーネルが新しすぎる?)
この代わりに、ドライバのパッケージを sudo apt install でインストールしました。

$ sudo apt remove --purge 'nvidia-*'
$ sudo apt remove --purge 'libnvidia*'
$ sudo apt autoremove
$ sudo apt autoclean
$ sudo reboot
$ sudo apt install nvidia-driver-418
$ sudo reboot

nvidia-smi は GPU を認識します。

$ nvidia-smi 
Sat Jul 16 00:00:24 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.129.06   Driver Version: 470.129.06   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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  NVIDIA GeForce ...  Off  | 00000000:01:00.0 N/A |                  N/A |
| N/A   59C    P0    N/A /  N/A |    244MiB /  1999MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

ドライバのバージョンが、"418" でなく "470.129.06"となっていますが、動くからよし、としました。

CUDAのバージョン

Nvidiaの以下のウェブサイトでドライバ 418.113 に適する CUDA のバージョンを確認すると CUDA 10.1 が最新でした。
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
一方、Nvidiaの以下のウェブサイトによると、Compute Capability 3.0には、CUDA10.2, cuDNN 8.4.1 が対応しています。
https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html
念の為、ドライバ 418.113 に適合する CUDA 10.1 を採用しました。

ちなみに、CUDA 10.2 + cuDNN 8 シリーズをインストールする場合、CUDA のサンプルプログラムは動作しました。しかし、cuDNN のサンプルプログラム "mnistCUDNN" の実行時には、GT 750M の機能不足に起因すると思われるエラーが発生しました。
CUDA 10.2 + cuDNN 7.6.5 をインストールする場合、CUDA のサンプルプログラムも mnistCUDNN も正常に動作しました。CUDA 10.2 + cuDNN 7.6.5 の組み合わせでもよかったかもしれません。

CUDA のインストール

Nvidiaの以下のウェブサイトから、CUDA 10.1のパッケージをダウンロードします。
https://developer.nvidia.com/cuda-toolkit-archive
私は、"CUDA Toolkit 10.1 update2 (Aug 2019)"から先に進み、"Linux", "x86_64", "Ubuntu", "18.04", "deb (local)"を選択しました。すると、"Installation Instructions:"が表示されます。
ここで、最後の"sudo apt-get -y install cuda"を実行すると、toolkit に加えて Display Driver をインストールしようとします。Display Driver の更新は不要なので、cuda-toolkitをインストールします。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo cp cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-10-1

".bashrc" などで、パスを設定します。

export CUDA_PATH=/usr/local/cuda
export PATH="$PATH:/usr/local/cuda/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"

nvcc -V を実行すると、バージョン等が表示されます。

$ nvcc -V
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 のサンプルを試してみます。しかし、ubuntu 22.04 の gcc-11 では、CUDA 10.1 のサンプルプログラムをコンパイルできません。CUDA 10.1 には gcc-8シリーズが上限のようです。

gcc-8.5 のインストール

sudo apt install で簡単にインストールできる gcc-8 のパッケージを探しましたが、見当たりませんでした。
そこで、ソースコードから gcc-8 シリーズをビルドしました。
GCC の以下のウェブサイトから適当なミラーサイト(例えば、Japan のミラーサイト)に移動します。
https://gcc.gnu.org/mirrors.html
"releases"の下には、歴代の gccディレクトリがあります。gcc-8 シリーズの最新の "gcc-8.5.0" に移動して "gcc-8.5.0.tar.gz" をダウンロードします。
gcc のビルドには、以下の記事が参考になります。
https://gcc.gnu.org/install/
https://gcc.gnu.org/onlinedocs/libstdc++/manual/configure.html
ソースコードを展開して configure, make, make install を行います。gcc-11 との共存のために、専用のディレクトリ(ここでは、"/usr/local/gcc-8.5")にgcc-8.5をインストールします。

$ tar zxf gcc-8.5.0.tar.gz
$ cd gcc-8.5/
$ ./configure --prefix=/usr/local/gcc-8.5 --program-suffix=-8.5 --disable-multilib --enable-languages=c,c++
$ make
$ sudo make install

なお、この設定では、検証用の3ステージのビルドのために時間がかかります。configure のオプションに "-disable-bootstrap" を追加して、1ステージのビルドで終わらせることも可能です。

また、gcc-11 と gcc-8.5 を使い分けるために、update-alternative を設定します。

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 70 --slave /usr/bin/g++ g++ /usr/bin/g++-11
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-8.5/bin/gcc-8.5 50 --slave /usr/bin/g++ g++ /usr/local/gcc-8.5/bin/g++-8.5

sudo update-alternatives --config gcc を実行して、gcc-8.5 を選択します。そして、CUDA のサンプルプログラムをコンパイルしてみます。サンプルプログラム集は、以下のコマンドでコピーできます。

$ cuda-install-samples-10.1.sh ./

いろいろなサンプルがあります。
1_Utilities/deviceQuery に移動して make を実行すると、deviceQuery が生成されます。 deviceQuery を実行すると、NVIDIA GeForce GT 750M の情報が表示されます。
5_Simulations/smokeParticles に移動して make を実行すると、smokeParticles が生成されます。smokeParticles を実行すると、きれいな動画が表示されます。

cuDNN のバージョン

cuDNN 8 シリーズを試したところ、サンプルプログラムの mnistCUDNN の実行時にエラーが発生しました。そこで、cuDNN 7 シリーズを採用します。Nvidia の以下のウェブサイトのリリースノートを参照して、GT 750M に適するバージョンを探します。
Release Notes :: NVIDIA Deep Learning cuDNN Documentation
cuDNN 7.6.4 のリリースノートには、以下のように、capability 5.3未満(Kepler等)の場合の Fixed Issues が記載されています。cuDNN 7.6.4 は、GT 750M でも動作しそうです。

Fixed Issues
The following issues have been fixed in this release:
Multihead attention will now return CUDNN_STATUS_ARCH_MISMATCH for true-half configuration on devices with compute capability less than 5.3 (for example, most of Maxwell and all of NVIDIA Kepler, and so on), which do not have native hardware support for true half computation. Previously, an error like CUDNN_STATUS_EXECUTION_FAILED may be triggered or inaccurate results may be produced. 

最新の cuDNN 7.6.5 のリリースノートには、capability 3.0 を除外するような記載は見当たりません。そこで、 cuDNN 7.6.5 を採用しました。

cuDNN のインストール

Nvidia の以下のページから、cuDNN 7.6.5 のパッケージをダウンロードします。メンバー登録が必要です。
https://developer.nvidia.com/rdp/cudnn-download
CUDA 10.1 用の cuDNN 7.6.5 の3つのファイルをダウンロードします。

  1. libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
  2. libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
  3. libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

各パッケージをインストールします。

$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

cuDNN のサンプルをコンパイルしてみます。

$ cp -r /usr/src/cudnn_samples_v7 ./
$ cd cudnn_samples_v7/mnistCUDNN
$ make
$ ./mnistCUDNN
(これで、"Test passed!" と表示されれば成功です)

Ubuntu 22.04 LTS を MacBook Pro (Retina, 15-inch, Late 2013) にインストールする

20.04のパーティションを消去して、22.04を新たにインストールしました。
インストール作業を再び行うときのために、作業内容を記録しました。
試行錯誤した作業を後から思い出しながらまとめたので、過不足があるかもしれません。

Ubuntu 22.04 のインストール

20.04のインストールと同じです。

  • Ubuntu の Bootable USBを MAC に接続
  • "option (⌥)" を押しながらMACを起動
  • Ubuntu インストーラを選択
  • Keyboard: 実機に合うものを選択します。私のキーボードは English (US)
  • Update ...:"Install third-party..."もチェックします (Wi-Fi用)
  • Installation Type:"something else" を選択して "Continue"
  • 次のメニューで Ubuntu用のパーティションを選択します。パーティションの設定画面で、以下の設定を行いました
  1. Size:変更せずにそのまま
  2. Use as:"Ext4 journaling ..."を選択
  3. Format the partition:チェックを入れる
  4. Mount Point: "/" に設定
  5. そして"OK"
  • メニュー下部の "Device for boot loader installation" で Ubuntuをインストールするパーティションを選択
  • ここで、念の為に、インストール用のパーティションを選択した状態にします
  • そして、"Install Now"

これで、Ubuntuを無事にインストールできました。再起動すると、Ubuntuが起動します。この状態で、Wi-Fiも動きました。
"option (⌥)" を押しながらMACを起動すると、macOSも起動します。

インストール後の設定

emacsのインストール

sudo apt install emacs-gtk
インストール前に"emacs"と入力するといろいろな候補が表示されます。他のパッケージは、簡易版などです。

open-sshのインストール

sudo apt install openssh-server

gufwのインストール

sudo apt install gufw

キーボードのCapsをCtrlに変更する

/etc/default/keyboard の以下の行を編集する

XKBOPTIONS="ctrl:nocaps"
("ctrl:nocaps"の代わりに"ctrl:swapcaps"でもよい)
FacetimeHDカメラのドライバのインストール

Patrik Jakobsson氏のツールを用います。
github.com
手順は、氏の以下の記事"Get Started"に書かれています。
Get Started · patjak/facetimehd Wiki · GitHub

ファームウェアの抽出

$ git clone https://github.com/patjak/facetimehd-firmware.git
$ sudo apt install make curl cpio
$ cd facetimehd-firmware/
$ make
Found matching hash from OS X, El Capitan 10.11.5
==> Extracting firmware...
 --> Decompressing the firmware using gzip...
 --> Deleting temporary files...
 --> Extracted firmware version 1.43.0
$ sudo make install
Copying firmware into '//usr/lib/firmware/facetimehd'

インストール

$ sudo add-apt-repository universe
$ sudo apt install kmod libssl-dev checkinstall
$ git clone https://github.com/patjak/bcwc_pcie.git
$ cd bcwc_pcie
$ make
$ sudo checkinstall
$ sudo depmod
$ sudo modprobe facetimehd

/etc/modulesに以下を記載

facetimehd
ログイン画面でユーザ名の表示を止める

/etc/gdm3/greeter.dconf-defaultsの

# disable-user-list=true

のコメントを外す。

Firefoxをsnap版からdeb版に変更する

これで、FirefoxGNOME Shell Extensions を管理できます。

$ sudo snap remove firefox
$ sudo apt-add-repository ppa:mozillateam/ppa

/etc/apt/preferences.d/mozilla-firefox に以下を記載

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001

Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1

/etc/apt/apt.conf.d/51unattended-upgrades-firefox に以下を記載

Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";
GNOME Shell Extensions のインストール
$ sudo apt install chrome-gnome-shell
$ sudo apt install gnome-shell-extension-prefs
$ sudo apt install gnome-shell-extension-manager

Firefox に add-on を追加
https://addons.mozilla.org/en-US/firefox/addon/gnome-shell-integration/
以下のウェブサイトから好みの拡張をインストールできます。
https://extensions.gnome.org/

fcitx5とmozcのインストール

以下の記事が参考になります。
gihyo.jp

  • sudo apt install fcitx5-mozc
  • im-config -n fcitx5
  • gnomeの"Settings"を起動
  • "Settings"画面内の左欄の "Region & Language" をクリック
  • 右欄の "Manage Installed Languages"ボタンをクリック
  • もし、"The Language support is not installed completely" と表示されたら "Install"ボタンをクリック
  • 表示されている "Language Support"画面の"Language"タブの"Keyboard input method system"のプルダウンメニューで "fcitx 5" を選択。そして、"Close"
  • sudo apt -y purge ibus (念のため)
  • システムを再起動
  • "Fcitx Configuration" を起動(Dockの"Show Applications"ボタンから起動できます)
  • "Input Method"タブを選択し、以下の手順で"Mozc"を追加
  1. 右側のリストから"Mozc"を選択(見当たらない場合、"Only Show Current Language" のチェックを外すといいかもしれません)
  2. 中央の"<"ボタンをクリックして"Mozc"を左のリストに移動させる
  • "Global Options"タブを選択
  • "Trigger Input Method"の右のボタンをクリックして、入力言語切り替えのキー組み合わせを入力し、"Apply"をクリック。私は、"Alt+`" を入力しました。

このキー組み合わせは、gnomeの設定と競合するので、gnomeの設定を変更します。

  • gnomeの"Settings"を起動
  • "Settings"画面内の左欄の "Keyboard"をクリック
  • 右欄の"Keyboard Shortcuts"の下の"View and Customize Shortcuts"をクリック
  • 検索欄に"Super"と入力して候補を絞ります。
  • 競合する"Super+`"に対応する"Switch windows of an application" の設定を、競合しない組み合わせ(e.g. "Alt+F1")に変更
  • "Settings"画面を閉じる。
gnome desktop の背景を画像から単色に変更
$ gsettings set org.gnome.desktop.background picture-uri ''
$ gsettings set org.gnome.desktop.background color-shading-type 'solid'
$ gsettings set org.gnome.desktop.background primary-color '#2d7d9a'
スクロールバーを常に表示する
$ gsettings set org.gnome.desktop.interface overlay-scrolling false
スクロールバー領域のクリックを、その位置へのワープから1ページ移動に変更する

~/.config/gtk-3.0/settings.ini に以下を記載

[Settings]
gtk-primary-button-warps-slider = false
Dockの"Show Applications"を上(左)に移動させる
$ gsettings set org.gnome.shell.extensions.dash-to-dock show-apps-at-top true
デスクトップにゴミ箱を表示する
$ gsettings set org.gnome.shell.extensions.ding show-trash true
xrdpのインストールと設定

以下の記事を参考にしました。
gihyo.jp
この記事は、Ubuntu 20.04向けのものですが、22.04でも同じ設定で動作しました。
この記事では、複数の設定ファイルをスクリプトを使って一度に処理しています。
私は、ファイル毎に設定を手動で書き込みました。

まず、xrdpをインストールします。

sudo apt install xrdp

ファイル"/etc/xrdp/startubuntu.sh"に、以下の内容を書き込みます。

#!/bin/sh
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
exec /etc/xrdp/startwm.sh

誰でも実行できるようにパーミッションを設定します。

sudo chmod a+x /etc/xrdp/startubuntu.sh

ファイル"/etc/xrdp/sesman.ini"の中の"startwm"を"startubuntu"に置換します。私の場合、以下の2行を編集しました。

; UserWindowManager=startwm.sh (元の行をコメントアウト)
UserWindowManager=startubuntu.sh (新たに追加)

; DefaultWindowManager=startwm.sh (元の行をコメントアウト)
DefaultWindowManager=startubuntu.sh (新たに追加)

同じファイル"/etc/xrdp/sesman.ini"の中の"FuseMountName=thinclient_drives"を"FuseMountName=shared-drives"に置換します。私の場合、以下の1行を編集しました。

# FuseMountName=thinclient_drives (元の行をコメントアウト)
FuseMountName=shared-drives (新たに追加)

ファイル"/etc/X11/Xwrapper.config"の許可ユーザを編集します。

# allowed_users=console (元の行をコメントアウト)
allowed_users=anybody (新たに追加)

ファイル"/etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla"に、以下の内容を書き込みます。

[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes

ファイル"/etc/polkit-1/localauthority/50-local.d/46-allow-update-repo.pkla"に、以下の内容を書き込みます。

[Allow Package Management all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=yes
ResultInactive=yes
ResultActive=yes

必要に応じて、"/etc/xrdp/xrdp.ini"を編集してポート番号を変更します。

port=XXXXX (XXXXXは、ポート番号)

gufwでxrdpのためのルールを追加します。

サーバを起動します。

sudo systemctl restart xrdp.service