画像コンペの進め方を晒すのでアドバイスください! / My pipeline for image competitions

70ae2d149767d4198aac83453481b8dd?s=47 Amane Suzuki
October 29, 2019

画像コンペの進め方を晒すのでアドバイスください! / My pipeline for image competitions

DeNA AIシステム部 データサイエンス(DS)チーム内で行っている輪講で使った資料です。
自分の画像コンペの進め方と、それに対して貰ったフィードバックをまとめた資料になっています。
DSチームの輪講の雰囲気も併せて感じてもらえると嬉しいです!

70ae2d149767d4198aac83453481b8dd?s=128

Amane Suzuki

October 29, 2019
Tweet

Transcript

  1. 3.

    自己紹介 鈴木 天音|Amane Suzuki • DeNA AIシステム部 データサイエンス1G • 2019年4月に新卒で入社

    • Kaggle Master • 最近画像コンペが好きになりつつある • 技術書典7で『ハマって覚えるデータ分析・機械学習の罠』を書いた 3
  2. 6.

    クラウド環境|Google Compute Engine • 使っているインスタンスはだいたい2つ • vCPU × 4, 30GB

    memory, NVIDIA Tesla T4 × 1, ondemand • vCPU × 4, 30GB memory, NVIDIA Tesla V100 × 1, preemptible • preemptible が落ちたことは GCE の機能を使って LINE に通知を飛ばして知る • GCE のインスタンスグループを作ると自動で再立ち上げが可能 • 環境構築:Deep Learning VM + pip • Pipenv→Dockerと1周まわってこれが結構楽な気がしている • ローカルとのソースコード同期:PyCharm の automatic upload • 1つしかインスタンスを立てない時はいいが、複数立てるときが面倒 • 軽いインスタンスを立ててソースコードを同期しておき、 それを複数のインスタンスにマウント(sshfs)すればよい • AI Platform Training を使えばいろいろな苦痛が軽減されるかも • データのVM間共有:Google Cloud Storage • 学習用と可視化用でインスタンスを分けたいときに便利 • Tensorboard のログも GCS に入れておくと便利 6
  3. 7.

    プロジェクトの構造 • configs/ 設定ファイル • datasets/ Kaggle Dataset に固めるディレクトリ •

    input/ 入力ファイル • logs/ 学習ログ(Catalystが吐く) • notebooks/ Jupyter Notebook • scripts/ 雑多なスクリプト • src/ ライブラリ • pretrained-models.pytorch/ • segmentation-models.pytorch/ • transforms.py • datasets.py • losses.py • metrics.py • samplers.py • utils.py • train.py • inference.py • requirements.txt 7
  4. 9.

    ライブラリ|pretrained-models + segmentation-models • https://github.com/Cadene/pretrained-models.pytorch • https://github.com/qubvel/segmentation_models.pytorch • 若干の改造を加えて使っている •

    最近 takuoko さんが鉄コンペのソリューションを上げていたので取り入れた • https://github.com/okotaku/kaggle_Severstal 9
  5. 10.

    コンフィグ|YAML • 可読性も高いし、コメントと参照が書ける • ある程度抽象化を行った残りの設定は .py ファイルに書くのも柔軟性があっていい • Python で設定ファイルを書ける

    yacs というものもある 10 preprocess: mode: multiclass model: architecture: Unet params: encoder_name: efficientnet-b5 encoder_weights: imagenet classes: 5 activation: softmax training: train_batch_size: 16 accumulation_steps: 2 valid_batch_size: 16 epochs: &epochs 100 optimizer: name: Adam params: lr: 0.0001 scheduler: name: CosineAnnealingLR params: T_max: *epochs transform: train: - name: CropNonEmptyMaskIfExists params: height: 256 width: 512 - name: Normalize - name: Flip params: p: 0.75 - name: ToTensorV2 valid: - name: Normalize - name: ToTensorV2 loss: name: CrossEntropyLoss
  6. 11.

    コンフィグ|Python側 • python train.py -c configs/001_baseline.yml で実験が走る • hasattr と

    getattr をふんだんに使ってパース • めっちゃ Bad Practice っぽいが名前↔オブジェクトのマッピングを書くのが面倒 11
  7. 12.

    学習結果の保存 • Catalyst の logdir を指定すればよしなにやってくれる • tensorboard --logdir=<logdir> で

    TensorBoard を立て、Port Forward して見る • GCS に TensorBoard 用のログをアップロードしておけば、 tensorboard --logdir=gs://hoge/fuga で立てることができる • <logdir> / <exp_name> / checkpoints 以下に重みを保存する • best.pth / best_full.pth / last.pth / last_full.pth はデフォルトで保存される • 凝ったことをしたければ callback を書く • exp_name はコンフィグファイル名から自動生成 • タイムスタンプは付けていない 実験を途中で止めたときにディレクトリ数が膨れ上がるので無くした • いつごろの時期に実験したものかを知ることには意味があるので、 最初に実験したときのタイムスタンプを引き継げばよいのでは? • checkpoint を出力するディレクトリの中に continue.sh みたいな再開スクリプトを 作っておくと便利 12
  8. 14.

    Test Time Augmentation(TTA) • Classification の場合は augmentation をかけて推論し、混ぜればいいが、 Segmentation の場合は

    augmentation をかけた後に逆変換をかけなければいけない • 現在は model(image) + flip(model(flip(image))) のように手で書いている • TTAchが便利で、拡張性も高そう ◦ https://github.com/qubvel/ttach 14
  9. 15.

    チーム戦の進め方 • あんまりうまくできている気がしない • 基本は独立で進めるが、良さげな知見があれば適宜共有 • 同部署なので、ランチタイムにちゃちゃっと今やっていることを MTG • 可視化結果は

    Slack と Kaggle Notebook を併用して共有 悩み • 「これ効いたよ〜」→全然効かないんやが。ということがよくある。逆も然り • 上位解法を見ても特定のテクニックが効いたり効かなかったりとばらつきがあるので 結局全部試す必要があるかも • 独立に進めるのではなく、ソースコードと実験計画を共有してシステマティックに やるのもいいかもしれない 15