I am Charmie

メモとログ

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#使うっぽいから候補から外す

Macのpython環境の改善

anacondaとpipを混ぜると危険らしいので整理

Anacondaのアンインストール

  • 以下の作業の後に .zshrc のanacondaの設定を削除する
conda install anaconda-clean
anaconda-clean
rm -fr ~/.anaconda_backup
rm -fr /anaconda3

python3のアンインストール

  • 依存関係のエラーが発生するため,依存関係を無視してアンインストール
brew uninstall --ignore-dependencies python3

pyenvのインストール

brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zprofile

pyenvを使ってPythonをインストール

  • pyenv global 3.11.3 の後にターミナルを再起動しないと変更が有効にならない
pyenv install 3.11.3
pyenv global 3.11.3