Slide 1

Slide 1 text

画像コンペの進め方を晒すので アドバイスください! 鈴木天音|Amane Suzuki DeNA AIシステム部 データサイエンス1G

Slide 2

Slide 2 text

資料公開用の補足 • DeNA AIシステム部 データサイエンス(DS)チーム内で行っている輪講の資料です • タイトルの通り、DSチームのメンバーからコンペのアイディアをもらう的な発表です • 黒字が僕の資料で、青字が発表時にいただいたアドバイスを要約したものです • 文字が多い資料ですが、DSチームの輪講の雰囲気を感じてもらえると嬉しいです! 2

Slide 3

Slide 3 text

自己紹介 鈴木 天音|Amane Suzuki • DeNA AIシステム部 データサイエンス1G • 2019年4月に新卒で入社 • Kaggle Master • 最近画像コンペが好きになりつつある • 技術書典7で『ハマって覚えるデータ分析・機械学習の罠』を書いた 3

Slide 4

Slide 4 text

実現したかったこと • 楽に画像コンペの実験を回したい • できるだけコンペ固有のコードは書きたくない • 実験設定ファイル + DataLoader を書いたら実験が走る • ログは Tensorboard でみたい 4

Slide 5

Slide 5 text

可視化・EDA • モデル不要の可視化は Kaggle Notebook が便利 • サンプルした画像を目視 • 各種統計量のチェック(ラベルの分布、画像サイズの分布など) • モデルの weight が必要な可視化は Jupyter Notebook を立てる • 知見が出たら slack に貼って共有 5

Slide 6

Slide 6 text

クラウド環境|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

Slide 7

Slide 7 text

プロジェクトの構造 • 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

Slide 8

Slide 8 text

ライブラリ|PyTorch + Catalyst • https://github.com/catalyst-team/catalyst • 訓練が簡単に書けるし、モデル内部に手を入れるのも(PyTorchなので)直感的 • 同じチームが MLComp というワークフロー管理ツールも開発している → 次回試す 8

Slide 9

Slide 9 text

ライブラリ|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

Slide 10

Slide 10 text

コンフィグ|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

Slide 11

Slide 11 text

コンフィグ|Python側 • python train.py -c configs/001_baseline.yml で実験が走る • hasattr と getattr をふんだんに使ってパース • めっちゃ Bad Practice っぽいが名前↔オブジェクトのマッピングを書くのが面倒 11

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

• segmentationの時は凝ったことをしたいことが多いので、Catalystは現状使っていない • 可視化して予測の確認をしたり、threshold searchをする前にはconfidence mapを 予め保存して使い回す 推論 13

Slide 14

Slide 14 text

Test Time Augmentation(TTA) ● Classification の場合は augmentation をかけて推論し、混ぜればいいが、 Segmentation の場合は augmentation をかけた後に逆変換をかけなければいけない ● 現在は model(image) + flip(model(flip(image))) のように手で書いている ● TTAchが便利で、拡張性も高そう ○ https://github.com/qubvel/ttach 14

Slide 15

Slide 15 text

チーム戦の進め方 • あんまりうまくできている気がしない • 基本は独立で進めるが、良さげな知見があれば適宜共有 • 同部署なので、ランチタイムにちゃちゃっと今やっていることを MTG • 可視化結果は Slack と Kaggle Notebook を併用して共有 悩み • 「これ効いたよ〜」→全然効かないんやが。ということがよくある。逆も然り • 上位解法を見ても特定のテクニックが効いたり効かなかったりとばらつきがあるので 結局全部試す必要があるかも • 独立に進めるのではなく、ソースコードと実験計画を共有してシステマティックに やるのもいいかもしれない 15