I am Charmie

メモとログ

Ubuntu 22.04: GPU on docker

  • ここが参考になる
    • Docker上でGPUを使う場合はCUDAのインストールは不要
  • nvidia-docker)の立ち位置がわからない...
    • NVIDIA Container Toolkitのこと?
  • NVIDIA Container Toolkitのインストール後に自分のdockerfileはどんな風に書いたらいいのか調べる

Dockerのインストール

# インストール
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# インストールの確認
sudo docker run hello-world

NVIDIA Driverのインストール

以下のコマンドでインストール可能なドライバを調べる。

sudo apt-cache search nvidia | grep -E "nvidia\-[0-9]{3}"
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-530

NVIDIA Container Toolkitのインストール

インストール

# レポジトリのconfigure
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update

# NVIDIA Container Toolkitのインストール
sudo apt install -y nvidia-container-toolkit

# Dockerのconfigure
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

確認

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

以下のような表示がされたらOK

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
37aaf24cf781: Pull complete 
Digest: sha256:9b8dec3bf938bc80fbe758d856e96fdfab5f56c39d44b0cff351e847bb1b01ea
Status: Downloaded newer image for ubuntu:latest
Sat Oct  7 09:06:31 2023       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.113.01             Driver Version: 535.113.01   CUDA Version: 12.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  NVIDIA RTX A6000               Off | 00000000:81:00.0 Off |                  Off |
| 30%   31C    P8               6W / 300W |     12MiB / 49140MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+

Mac: インストールUSB作成

ディスク一覧の表示

diskutil list

USBメモリ( /dev/disk2 )をフォーマット

diskutil eraseDisk MS-DOS UBUNTU /dev/disk2

.isoファイルの書き込み

# いったんアンマウント
diskutil unmountDisk /dev/disk2
# 書き込み
sudo dd if=./ubuntu-22.04-live-server-amd64.iso of=/dev/rdisk2

USBメモリの取り出し

diskutil eject /dev/disk2

hydra

hydraは階層構造を持つ設定を扱うためのPythonフレームワーク

  • このサンプルが分かりやすい
    • 設定を外部ファイル(yaml形式)として保持
    • メインプログラムは設定ファイルを読み込んで,インスタンスを生成
  • このjupyter notebookを見ると,設定ファイルを読み込むタイミングはいつでもOKっぽい気もする

設定ファイルを自由自在に読み込む

以下のように hydra.initialize() で設定ファイルのディレクトリを指定して, hydra.compose() で設定ファイルを読み込む

from hydra import initialize, compose
from omegaconf import OmegaConf

with initialize(version_base=None, config_path="conf/sub"):
    cfg1 = compose(config_name="setting_1.yaml")
    print(OmegaConf.to_yaml(cfg1))

    cfg2 = compose(config_name="setting_2.yaml")
    print(OmegaConf.to_yaml(cfg2))

サンプル

以下のように,yaml形式で保存した設定を取得できる

Config (conf/config.yaml)

db:
  driver: mysql
  user: omry
  pass: secret

Application (main.py)

import hydra
from omegaconf import DictConfig, OmegaConf

@hydra.main(version_base=None, config_path="conf", config_name="config")
def my_app(cfg : DictConfig) -> None:
    print(OmegaConf.to_yaml(cfg))

if __name__ == "__main__":
    my_app()
  • サンプルプログラムの設定をyaml形式で保存したファイルは以下の通り.
  • ??? という文字列は {AnyNode} ??? <MISSING> という値が登録されていたので,NaN的な位置付けなんだと思う.
batch_size: 64
test_batch_size: 1000
epochs: 14
no_cuda: false
dry_run: false
seed: 1
log_interval: 10
save_model: false
checkpoint_name: unnamed.pt
adadelta:
  _target_: torch.optim.adadelta.Adadelta
  params: ???
  lr: 1.0
  rho: 0.9
  eps: 1.0e-06
  weight_decay: 0
steplr:
  _target_: torch.optim.lr_scheduler.StepLR
  optimizer: ???
  step_size: 1
  gamma: 0.1
  last_epoch: -1

階層構造を持つときの対応

  • @dataclass で定義したConfigクラスにmutable なデフォルト値を設定しようとするとこんなエラーが発生
    • Configクラスを入れ子式にしてデフォルト値を設定しようとすると strオブジェクトは()使えない 的なエラーが発生した
    • Configクラスのオブジェクトをデフォルト値として設定するときに注意する必要あり
    • 公式チュートリアルのコードを参考にすればいけた.
from dataclasses import dataclass, field

from hydra_configs.torch.optim import AdadeltaConf
from hydra_configs.torch.optim.lr_scheduler import StepLRConf


@dataclass
class MNISTConf:
    batch_size: int = 64
    test_batch_size: int = 1000
    epochs: int = 14
    no_cuda: bool = False
    dry_run: bool = False
    seed: int = 1
    log_interval: int = 10
    save_model: bool = False
    checkpoint_name: str = "unnamed.pt"
    # mutableなオブジェクトはdefault_factoryを使って指定
    # adadelta: AdadeltaConf = AdadeltaConf()
    adadelta: AdadeltaConf = field(default_factory=AdadeltaConf)
    # mutableなオブジェクトの引数を指定する場合はlambda関数を使って指定
    # steplr: StepLRConf = StepLRConf(
    #     step_size=1
    # )
    steplr: StepLRConf = field(default_factory=lambda: StepLRConf(step_size=1))

インスタンス化

  • サンプル
  • hydra.utils.instantiate(): インスタンス生成 (call()のエイリアス
  • hydra.utils.call(): 関数の実行
  • hydra.utils.instantiate()を使うことで,importしないでオブジェクトを生成できる
  • 関数への引数を上書きしたい場合は instantiate() に上書きしたい引数名・引数を入れる (override parmeters って表現してる)
optimizer:
  _target_: my_app.Optimizer
  algo: SGD
  lr: 0.01
@hydra.main(version_base=None, config_path='conf/', config_name='config')
def main(cfg):
    opt = instantiate(cfg.optimizer)
    # Optimizer(algo=SGD,lr=0.01)

    opt = instantiate(cfg.optimizer, lr=0.2)
    # Optimizer(algo=SGD,lr=0.2)

hydra-torch

  • PyTorch用のconfigを扱えるようにするパッケージ
  • チュートリアルではyaml形式ではなくpyファイル内に設定をベタ書きする方法を紹介
    • yaml形式で設定を保存する方法が分からなかったので,読み込んだ設定をOmegaConf.save() で保存したファイルを使うようにした
    • 読み込んだ設定からoptimizer, schedulerのオブジェクトを生成する機能はないっぽいhydra.utils.instantiate() で可能)

iteratorとgenerator

  • generatorは yield 使うやつ?
  • listとかで呼び出すときに,必要な要素だけ返すからメモリ効率が悪くならない

  • ジェネレータクラスから作ったイテレータ生成オブジェクトは何度もループで使える

  • ジェネレータ関数で生成したオブジェクトはループで回せるのは一回
class MyIteratorClass(object):
    def __init__(self):
        pass
    
    def __iter__(self):
        # do something
        if satisfy_end_condition:
            raise StopIteration()
        yield some_value

my_iterator = MyIteratorClass()

# 同じ内容のprintが2回出力
for n in my_iterator():
    print(iterator)

for n in my_iterator():
    print(iterator)
def MyIteratorFunction():
    # do something
    if satisfy_end_condition:
        raise StopIteration()
    yield some_value

my_iterator = MyIteratorFunction()

# 2回目のforループでは何も出力されない
for n in my_iterator():
    print(iterator)

for n in my_iterator():
    print(iterator)

ハイパフォーマンスPython: 3章 ListとTuple

ハイパフォーマンスPython: 3章 ListとTuple

  • listの対象は動的
    • appendするときに余剰な要素数を含めた別のlistを作成し既存要素のコピーと追加要素の代入を行う
  • tupleの対象は静的
    • 2つのtupleを連結して新しいtupleを作ることはできる
# tupleの連結
t0 = (0, 1, 2)
t1 = (3, 4, 5)
t2 = t0 + t1
print(t2)

Simulator

Documentationを流し読みした限り,BlenderProc2が学習コスト・やりたいことに合致してるかな.

Kubric

  • dockerでインストール・実行
  • 画像
    • RGBA
    • Depth
    • Segmentation
    • Surface normal
    • optical flow
  • 基本オブジェクト: suzanne, teapotあり
  • レンダリングするシーンを .blendファイルとして出力可能

KuBasic

https://kubric.readthedocs.io/en/latest/_images/KuBasic.jpg

UnrealCV

www.youtube.com

  • 作成した仮想空間中を動きながら撮影・画像処理を適用する
  • Unreal Engine 4のプラグインとしてインストール
  • 画像
    • RGBA
    • Depth
    • Segmentation
    • Surface normal
  • 基本シーンが4つぐらいあるけど,3次元モデルを読み込む方法がわからない(UE4の機能を使うのかも)

BlenderProc2

https://user-images.githubusercontent.com/6104887/137109535-275a2aa3-f5fd-4173-9d16-a9a9b86f66e7.gif

Unity perception package

  • CVの学習・検証データ作成のためのツールキット
  • Unityの使い方も勉強しなきゃいけない?
  • COCOフォーマットで出力できる
  • C#使うっぽいから候補から外す