I am Charmie

メモとログ

plotlyで作成するhtmlファイルのサイズ圧縮

plotlyを使って作成したhtmlファイルのファイルサイズが巨大になる問題の解決策がstakoverflowに投稿されていた.

  • ファイル出力する際に,plotlyjsのソースコードを出力ファイルに含めるためファイルサイズが巨大になってしまう
  • include_plotlyjsオプションの設定次第で3MB程度圧縮できる
filename = 'my_plotly.html'
# fig.write_html(filename)
with open(filename, 'w') as file:
    file.write(fig.to_html(full_html=False, include_plotlyjs='cdn'))

pip install datumaro on Mac

タイトル通り,datumaroMacにインストールするときのエラーの対処

brew install rustup
rustup-init
source "$HOME/.cargo/env"
pip install datumaro
# datumaro をimportするときに openvino, tbb関係のエラーが出る場合
brew install tbb

yolov8 with anaconda

YOLOv8をAnacondaの仮想環境で使う

conda create -n yolov8 python=3.11
conda activate yolov8
mkdir yolov8
cd yolov8
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics/
pip install -r requirements.txt
pip install ultralytics
cd ..

sample code

import numpy as np

import plotly.express as px
import plotly.graph_objects as go

from ultralytics import YOLO


# モデルの読み込み
model = YOLO('yolov8n-seg.pt')
number_of_classes = len(model.names)
colors = px.colors.sample_colorscale("hsv", [n/(number_of_classes-1) for n in range(number_of_classes)])

# テスト
filename = 'https://ultralytics.com/images/bus.jpg'
results = model(
    filename,
    save=True,
    save_txt=True,
    save_conf=True
)
# テスト結果の描画
for i, result in enumerate(results):
    image = result.orig_img[..., ::-1]
    fig = px.imshow(image, color_continuous_scale='gray')
    fig.update_layout(coloraxis_showscale=False)

    # 検出結果の取得
    number_of_objects = len(result.masks.xy)
    print(f'検出した物体の総数: {number_of_objects}')
    object_classes = result.boxes.cls.int().tolist()
    object_confidences = result.boxes.conf.tolist()

    # 検出した物体一つ一つをプロット
    for j, mask in enumerate(result.masks.xy):
        print(f'  {j}番目の検出物体')
        print(f'    クラス: {model.names[object_classes[j]]}')
        print(f'    信頼度: {object_confidences[j]}')
        fig.add_trace(
            go.Scatter(
                x=mask[:, 0],
                y=mask[:, 1],
                marker=dict(
                    color=colors[object_classes[j]],
                ),
                name=f'{model.names[object_classes[j]]}: {object_confidences[j]}',
                mode='lines',
            )
        )
    fig.show()

PyTorch Lightning + Hydra

PyTorch LightningとHydraを組み合わせるという流れに乗ろうと思った.

  • このレポジトリで公開しているテンプレートが便利
  • WanDBを使ったダッシュボードは面白かった
  • 以下がパッと分からなかったので導入は新年度からにする
    • WanDB
      • 各グラフを画像として取得する方法
      • 具体的な数値データを取得する
    • Hydra
      • ログに残すデータの設定(単に全configを読むのがめんどくさかった)

PyTorch Lightning

PyTorch Lightningを使ってみた.

https://pytorch-lightning.readthedocs.io/en/0.7.1/_images/pt_to_pl.jpg

  • この解説がわかりやすかった
  • PyTorchにおけるBoilerplate codeを減らすための工夫が施されている
  • 学習の処理(一バッチ分)をモデルクラスの関数に書くことで,学習の二重ループを書かなくて済む
    • lossfun: ロス関数の定義
    • configure_optimizers: optimizerの定義
    • train_dataloader: 学習データのデータローダの設定(@pl.data_loadeで修飾する必要あり)
    • val_dataloader: 検証データのデータローダの設定(@pl.data_loadeで修飾する必要あり)
    • training_step: 一バッチ分の学習ステップを定義
    • validation_step: 一バッチ分の検証ステップを定義
    • validation_end: 一エポック分の検証ステップ終了時の計算を定義
  • optimizer,データローダについてもモデルクラスの関数に書けるんだけど気持ち悪い.何か思想的な部分で理解が足りないんだと思う
  • 色々なレシピを公開してくれているのもありがたい
  • optimizerの説明を見たけど,optimizerを途中で切り替える方法が分からなかった.
    • やりたいこと: 学習の途中で更新するパラメータ,学習率を切り替えたい
    • この方法on_train_epoch_startでエポック数に応じて切り替える)が一番わかり易い

サンプルプログラムは以下の通りで,学習のプログラムが簡潔に書ける.

# main.py
# ! pip install torchvision
import torch, torch.nn as nn, torch.utils.data as data, torchvision as tv, torch.nn.functional as F
import lightning as L

# --------------------------------
# Step 1: Define a LightningModule
# --------------------------------
# A LightningModule (nn.Module subclass) defines a full *system*
# (ie: an LLM, diffusion model, autoencoder, or simple image classifier).


class LitAutoEncoder(L.LightningModule):
    def __init__(self):
        super().__init__()
        self.encoder = nn.Sequential(nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 3))
        self.decoder = nn.Sequential(nn.Linear(3, 128), nn.ReLU(), nn.Linear(128, 28 * 28))

    def forward(self, x):
        # in lightning, forward defines the prediction/inference actions
        embedding = self.encoder(x)
        return embedding

    def training_step(self, batch, batch_idx):
        # training_step defines the train loop. It is independent of forward
        x, y = batch
        x = x.view(x.size(0), -1)
        z = self.encoder(x)
        x_hat = self.decoder(z)
        loss = F.mse_loss(x_hat, x)
        self.log("train_loss", loss)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
        return optimizer


# -------------------
# Step 2: Define data
# -------------------
dataset = tv.datasets.MNIST(".", download=True, transform=tv.transforms.ToTensor())
train, val = data.random_split(dataset, [55000, 5000])

# -------------------
# Step 3: Train
# -------------------
autoencoder = LitAutoEncoder()
trainer = L.Trainer()
trainer.fit(autoencoder, data.DataLoader(train), data.DataLoader(val))

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      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+