かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

2024 年を振り返る


Kaggle

今年は 4つ時間をかけてコンペに参加して戦績は、チーム金1、チーム銀1、メダルなし2 でした。 また Kaggle のコンペへの参加をはじめて6年半、ようやく目標にしていた Kaggle Competitions Grandmaster になれました。
詳細は GMになったよエントリ に書いています。

メダルを取れた 2枚のコンペはどちらも、地道に続けてきたコンペの復習が実を結び、銀圏までソロで到達、チームアップして金/優勝を目指すといった具合で進行しました。
チーム内での貢献度の観点ではまだまだ成長の余地があると思うので、これからも精進します。

先のエントリでは触れなかった メダルなしの 2つのコンペについて簡単に振り返ります。

ISIC 2024

患者の皮膚の病変データが皮膚がんかどうか判別するコンペでした。2ヶ月弱参加しました。
正例に対して負例の数がめちゃくちゃ多い不均衡のデータで、画像の oof 予測値を特徴量にした Tree モデルのアンサンブルハイスコアノートブックが公開されているコンペでした。

ハイスコア公開ノートブックをそのまま fork したサブで銅メダル圏~圏外の N00位くらいまで埋め尽くされていて、まあ shake が起こるだろうと予測できたので、頑健なモデルを作ってごぼう抜きしたろうと参加しました。またこの ISIC の過去コンペでチーム銀を取っていたこともあり、色々アンサンブルすれば銀は取れるっしょ!と調子に乗っていました。

自分なりに不均衡データの対策と関西kaggler 会などで言及されていた補助ロスやいろんなネットワークをスタッキングして頑健なモデルを作ったつもりでしたが、なかなか Public LB は上がらず、ひたすら CV を信じる苦しいコンペでした。

private で一番良かったのは、公開ノートブックを 6 seed avg したものだったのですが、ハイスコア公開ノートブックよりは自分がコネコネしたソリューションの方が private はええやろ!と思い選びませんでした。

shaky なコンペであっても強い人は強いソリューションを作られているので、自分も頑健なモデル、ソリューションを作れるように取り組んでいきたいです。

RSNA 2024

腰椎MRI(3D画像)から5つの腰椎変性疾患の椎間板レベルのそれぞれについて、重症度を正常/軽度、中等度、重度の3段階に分類して検出するコンペでした。

ISIC コンペが歯が立たなかった悔しさから、1ヶ月チャレンジしたコンペでした。 結果は惨敗でした。

銅メダルくらいの single fold ノートブックやそれには及ばないが別のアプローチで近いスコアが出ているノートブックが公開されており、

  • 銅メダルくらいの single fold ノートブックを 5fold avg すれば銅メダルは余裕やろw
  • 3通りのアプローチを 5fold で回して stacking すれば銀は堅かろうw
  • 業務でも YOLOX 使ってるし、物体検出+分類の 2stage アプローチもいけるやろ

とたかを括って撃沈しました。

3つ目の方針は上位ソリューションでも活用されている方法でしたが、特徴量として与えられていた Keypoint と複数のスライスの使い方が最後までわからなかったです。

上位ソリューションに現れるようなアイデアが閃いても実装できなければ成果に結びつかないという当たり前のことを改めて痛感しました。 (だからこそアイデアと実装を埋めるために復習が効果的だと思います。)

仕事

引き続きキャディにお世話になっています。勤続2年と1ヶ月です。
業務内容は MLOps をやっていた時期 MLE 的な業務をやっていた時期とで半々くらいでした。 MLE として入社しましたが、MLOps、顧客や CS さんとの対話・Rust など色々な領域にチャレンジさせてもらえています。
全部は書けないのですが、テックブログなどで公開されている範囲で書いていきます。

kfp を使った再学習パイプライン

ML モデルの作成は属人化しやすい特徴があると思います。担当者が異動したり、辞めたりするような場合に引き継ぎがドカンとくる状況や、何かあったときに作った人間しか改修できない状況はあまり健全ではなさそうです。
チームとして ML モデルを運用していくにはどうすれば良いか? を考えられました。

非同期ML推論基盤

オンライン API として作成していた ML モデルの推論を非同期処理として実装するための基盤を作成しました。
使用していたオンライン API のサービスが 0スケールしなかったり、GPU を扱う都合上、適切なクラウドサービスがなかったため自作することになりました。
システム要求を満たすために複数のクラウドサービスを組み合わせたり、サービスごとの権限設定や、IaaS によるインフラの管理などを経験できました。

生成AI 関係の検証

現行システムと比較して QCD を満たせるかどうかなどをチームで丁寧に検証しました。
キャディではプロダクトマネージャーが担うことが多いのですが、担当エンジニアとして顧客との定例 MTG や CS さんとの打ち合わせに同席し、顧客課題の解像度を高めることができました。

その他

  • チームの Embedded SRE に立候補して、自チームとSREチームとの連絡窓口をしたり、デプロイ済みのモデルについてリトライポリシーを設定した
  • Datadog で日々エラーの状態などを監視
  • 別チームが管理している Rust で書かれたライブラリへ PR を出すために少し修正をしました。

対外的な活動

3月 - キャディと LPIXEL さんとで実施した合同イベントで久しぶりに登壇しました。 https://www.docswell.com/s/kaeru_nantoka/Z8G8EW-2024-03-22-142237/1

12月 - 会社の技術部署で実施したアドカレに記事を投稿しました。 https://caddi.tech/2024/12/07/000122

英語

特に必要性に駆られているわけではないのですが、kaggle championship の時や新婚旅行でコミュニケーションができなかった悔しさは残っており、せめて相手が何言っているかは聞き取れるようになりたいと常々思っています。

そこで、海外ドラマの BCC の SHERLOCK にハマって妻と視聴しています。ゆくゆくは英語で視聴するため、まずは吹き替え版を楽しんでいます。4season あって、各3話、90min ずつあるのですごいボリュームです。
また、SHERLOCK は海外でも人気があるので、Youtube で海外の方がフレーズの解説動画を作っていたりします。そういったコンテンツも活用しながら気ままに学習しています。

プライベート

2月に引っ越しして、5月に結婚式を挙げました。
準備は大変でしたが、家族や友人に見守られ、思い出に残る良い式になりました。

まとめ

Kaggle Competitions Grandmaster になれました。仕事では様々な領域にチャレンジし、幅が拡がりました。2025年は、もう少し ML システムという観点でインフラも含めた知識と実装の経験を増やして、自分の中でこれという答えを提示できるようになりたいです。
2024年もありがとうございました。

Kaggle Competitions Grandmaster になるまでの 6年半を振り返る

はじめに
Kaggle遍歴
バックグラウンド
Kaggle との出会い
思い出深いコンペたち
Kaggle の取り組み方
Kaggle で得られたもの
今後
おわりに

はじめに

こんにちは、kaerururu です。 Kaggle を始めて約6年半、目標だった Competitions Grandmaster になることができました。
一つの節目として、振り返り記事を書いてみようと思います。

www.kaggle.com

Kaggle遍歴

略表

日付 Event
2018/08/07 初サブ (Titanic)
2018/12/19 初メダル (銅)
2019/02/14 Expert
2019/04/10 初金メダル
2019/06/29 Master
2024/12/20 Grandmaster

金メダルを獲得したコンペ

コンペ 分野 チーム 成績 メダル
PetFinder.my Adoption Prediction マルチモーダル ・gege-san
・takuoko-san
・ynktk-san
・u++-san
1/2023 🥇
Freesound Audio Tagging 2019 音声 (画像) ・arai-san
・uratatsu-san
7/880 🥇
PetFinder.my - Pawpularity Contest マルチモーダル ・yuki-san
・johann-san
・cpptake-san
・shokupan-san
5/3537 🥇
Feedback Prize - English Language Learning NLP ソロ 13/2654 🥇
Eedi - Mining Misconceptions in Mathematics NLP ・tereka-san
・ahmet-san
・masaya-san
7/1446 🥇

バックグラウンド

  • 経済学部卒
  • 新卒は金融系の営業職
  • 社会人になってからプログラミングを始めた
  • 転職を重ね、CADDi に在籍中
    • (ex) DMM.com ← ストックマーク ← 金融系のシステム会社

Kaggle との出会い

経済学部を卒業し、金融系の営業職に新卒入社しました。 新規顧客開拓業務で、同期が次々と初受注を決めていく中、うまくいかない日々を送っていました。営業職から別の業界職業への転身を考えていたところプログラミングと出会いました。書きやすいらしいという理由で Python を選びました。 「コードを書く、自分で書いたプログラムが動く」シンプルなことですが、感動しました。
当時Twitterでは、「駆け出しエンジニアと繋がりたい」のハッシュタグのもと自分と似たような別の業界出身の人たちが転職活動のためのポートフォリオとして Webアプリを作成することが流行っていました。 どうせ作るなら AI を使うと面白そうだと思って、何かしらの画像を post すると画像によって何かしらのレスポンスがテキストで返ってくるような LINE BOT を作成しました。いくつかの Qiita 記事を参考に、Heroku (インフラ)+LINE API+Keras の構成で、画像は自分でスクレイピングしてきたものを使用しました。
何となく DeepLearning model を作成する方法はわかったのですが、AI にあげるたくさんのデータの入手の仕方がわからんとなりました。無料で使えるビッグデータないかなと探して見つけたのが Kaggle でした。

思い出深いコンペたち

参加して何かしらのサブをしたコンペは全部で 60、メダルを獲得したコンペは 22 ありました。 数が多いので、金+印象に残っているコンペに絞って思い出語りします。


PLAsTiCC Astronomical Classification 🥉 (103/1089)

望遠鏡による観測データから、観測対象の天体が属するクラスを分類するコンペです。通称 plasticc コンペ。 公開ノートブックをベースに取り組みました。天体に関するドメイン知識は当然のようになかったのですが、web などで天体に関する公式を調べつつ手元のデータをこねこねして作った特徴量で CV と LB が改善していくのがひたすら楽しく夜通し実験していたのを今でも覚えています。

当時は Notebook コンペというものがなく、ローカルで計算して CSV を提出すればよかったのですが、ルールをよくわかっておらず Notebook 縛りで取り組んでいました。

この何が辛いというと、時系列の情報があって tsfresh というライブラリで作られる特徴量が強かったのですが、Notebook で実行するとすぐメモリ落ちして使えなかったです。今では笑い話です。

このコンペで何とか銅メダルを獲得しました。未経験ながら、その成績とやる気を買って MLエンジニアとして迎えてくれたのがストックマークでした。(大感謝です。。。)


PetFinder.my Adoption Prediction 🥇 (1/2023)

(当時のLBスクショツイートがなかった)

マレーシアのペットショップで犬・猫が引き取られる速さを予測するコンペでした。通称 Petコンペ。

はじめて金メダルを取ったコンペで、初めて優勝したコンペになりました。 (コンペになりました、というのは Private 2nd で finish したのですが、1st チームの不正がバレてチームごと ban になって繰り上がったからです...笑)

最初ソロで、公開Notebook を参考に特徴量をこねこねし、銀圏手前の銅圏に入ったあたりで Twitterでやり取りのあった u++ san, ynktk-san, takuoko-san に一緒にやりませんか!と声をかけてチームマージしてもらいました。チームになってからはチームメイトが強すぎてどんどん weight が減っていって焦りました。最後金圏付近でマージした gege-san が私が Notebook に投稿した特徴量を使用していたため、weight が少し戻るといったこともありました。

このチームはコンペが終わった後も slack で情報交換を続けていたり、たまにご飯行ったり、書籍のレビューに参加させてもらったり、Kaggle Championship の決勝でスペインに一緒にいったり、とにかく色々な経験をさせてもらいました。ありがとうございます。

当時のブログ記事


Freesound Audio Tagging 2019 🥇 (7/880)

環境音データに対して「エンジン音」や「男性の歌声」などのタグを付けるタスクで、マルチラベル分類のコンペでした。通称 freesound コンペ。

理論を学ぶべく参加した勉強会で意気投合した arai-san とはじめからチームで参加しました。その後 plasstic コンペの反省会で知り合った uratatsu-san と 3人で取り組むことになりました。

wav で提供された音声データでしたが、メルスペクトログラムに変換して 2DCNN で解くベースライン Notebook が公開されており、こちらを参考に開始しました。いろんなネットワークや augmentation を実装してみたり PyTorch に慣れることができました。

この頃は GPU Notebook 使用上限が一人一回につき 6 個とかだったのでみんなで Fold を分担して回したりしてました。

精度面ではあまり貢献できなかったので悔しかったですが、わいわい楽しく取り組めた良い経験でした。

また、このメンバーでは Bengali.AI Handwritten Grapheme Classification (通称ベンガル語コンペ) も一緒に取り組んで大 shake down を経験しました。Private にしかない unseen data への対応をやっていなかったのですが、この経験が Public と Private のデータ差異への意識を強くするきっかけになったと思います。

このコンペの後くらいから Kaggle の GPU が使い放題でなくなり、個人で GPU マシンを買う方が増えたと思います。私はケチって 2080 ti 1枚挿し (11GB) のマシンを買いました。(後で Titan RTX を購入して挿し替えたり、2枚目を購入したりしているので思い切って投資すれば良かったと後悔気味です。)

当時のブログ記事


PetFinder.my - Pawpularity Contest 🥇 (5/3537)

保護動物の里親探し団体がホストで、与えられた犬猫画像に対して独自に定義された連続値である可愛さスコア(Pawpularity) を予測するコンペでした。通称 Pet2 コンペ。

trainデータが少なく、ターゲットがノイジー(類似画像で異なる) で与えられており、画像だけだと運要素が強かったのですが、過去コンペと被りの画像があって、類似度でマッチさせて過去コンペ由来の特徴量を加えるとスコアが跳ね上がる特徴がありました。

リークに気づかず銅メダルをふらふらしていたところ、2位にいたチームメイトたちから誘われて参加しました。(2位から誘われたら断れない。。) 過去の同一ホストのコンペで優勝した経験から声をかけてもらえたそうです。 チームでは、主に過去コンペ画像とコンペ画像のマッチング件数の probing, マッチングのための類似度計算部分の高速化やアンサンブルなどを担当しました。 愉快な yuki-san, johann-san, cpptake-san, shokupan-san と日々ビデオチャットを繋いでわいわい取り組めました。

この頃には Titan RTX への換装も終えており、あまりストレスなく画像のネットワークを使っていたかと思います。

当時のブログ記事


Feedback Prize - English Language Learning 🥇 (13/2654)

英語学習者によって書かれたエッセイを、文法や語彙などの6つの基準で評価するコンペでした。通称 feedback3 コンペ。

この時、3つの金メダルを持っており、4つ目はソロで取ろうと決めてソロ参加縛りを続けていました。めちゃくちゃしんどかったです。

世は大 deberta-v3 時代でした。Titan RTX 1枚挿しの GPU マシンでは少し時間かかっちゃうなと、思い切って増設しました。Titan RTX 2枚挿しの VRAM 48GB です。この構成はまだまだ現役で使用しており、LLM の Qwen2.5 32B を qlora チューニングすることまでできます。(72B はもうメモリに乗らなかった。)

次の shaky な要素が揃ったコンペで Public LB が正直機能していなかったです。

  • 少ない学習データ
  • 評価指標が複数 column の RMSE 平均
  • ハイスコア Public Notebook
  • LB 表示が小数点2桁まで

Trust CV と多様性確保に全振りして何とか Public/Private ともに金圏に残れたので嬉しかったです。

takoi-san の CommonLit のソリューション は何度も見返しました。

当時のブログ記事


HuBMAP - Hacking the Human Vasculature 🥈 (33/1021) (26 shake down 🔻)

ここからは 3連 shake down の惜しいコンペたちです。

まずは通称 hubmap2023 コンペ。ヒト腎臓組織スライドから微小血管構造のインスタンスをセグメンテーションするコンペでした。

データセットに次のような特徴があって、shake の可能性が事前にわかっていました。

  • 合計5枚の全スライド画像(WSI)からタイルを抽出
  • 2つのデータセットとして分割 (DS1, DS2)
  • 片方は専門家のアノテーションあり (clean)、もう片方はなし (noisy)
  • 5枚の WSI それぞれが train:public_test:private_test=2:2:1 で分けられる
  • テストセットは DS1 由来のもの
  • DS3 として追加の 9つの WSI 由来のアノテなしタイル

shake の可能性がわかっていたので十分に気をつけていたつもりですが、CV と Public LB のみに効く謎の後処理が公開されており、これに頼って金圏を keep していたため shake down してしまいました。

チームメンバーは anonamename-san と harshit-san でした。チームマージ前にそれぞれで実装していたものをうまく組み合わせることができました。楽しかったです。

当時のブログ記事


Child Mind Institute - Detect Sleep States 🥈 (15/1877) (4 shake down 🔻)

手首につける加速度計の観測データから入眠(onset)と覚醒(wakeup)のイベントを検出するコンペでした。通称睡眠コンペ。

センサーデータをあまり扱った経験がなく、勉強のために参加しました。 パッとしなかったのですが、公開されたげきつよ pipeline をベースに改善をしたところ一気に銀圏上位までスコアを伸ばせたのでチームマージしてもらいました。

チームメンバーによる後処理やアンサンブルによって Public 金圏で finish できたのですが、結果は少し shake down してしまいました。個別モデルの強さが他のチームの方が強かったです。

アンサンブルによる多様性強化はもちろん大事だが、個別モデルの精度追求も最後まで抜かりなくやらないといけないという学びになりました。

この時チームマージした tereka-san の CNN と Transformer の実装がわかりやすく、基礎の復習に活用させてもらいました。これまで timm 経由でなんとか Net を Deep で pon しがちだったのですが、Conv Unit や UNet を自分で実装できるようになり、後続の LEAP コンペでも健闘できました。

当時のブログ記事


LEAP - Atmospheric Physics using AI (ClimSim) 🥈 (19/693) (7 shake down 🔻)

計算コストが高い気候シミュレータ(E3SM-MMF)をエミュレートするMLモデルを作成するコンペでした。通称 LEAPコンペ。

以下のような特徴を持ったテーブルデータでした

  • データ量がものすごく多い
    • train: 1000万件 (360GB), test: 62.5万件(7GB)
    • train data は subsample で huggingface 上に元データ (5000万件)
    • さらに高解像度データも...
  • CSV 提出

とにかくデータがデカすぎました。このコンペをきっかけに外付けのSSD (2TB) を増築しました。 データ量が多いので、いかに計算を早くできるか実装を工夫しました。 またデータがそれぞれ float64 で保存されており、安易に float16 などに cast してしまうと情報が失われ、予測の精度が落ちる難しさがありました。

実施した工夫

  • mmap ã‚„ hdf5 などこれまで触ってきてなかったデータの保存形式を勉強して使用
  • 事前に計算できるものはして保存しておく
    • 事前に target ã‚’ weight で重みつけして全件の std, mean を計算
    • 巨大な csv ã‚’ç´„ 650,000 件の chunk * 15 に分割して保存する (65万件なのは test data の length と近づけるため) (fp64)
    • 全ての chunk に対して事前計算した std, mean で scaling して保存 (fp32)
      • fp32 なのは fp64 と比較したときあまり変わらなかったため
      • 事前に scaling まで済ませておくことで、dataloader で計算しなくてよくなる
  • 実行時、メモリに特徴量を事前に load しておく
    • dataloader で都度特徴量を load すると iteration 回数分遅くなる (I/O bound)

これらの工夫の甲斐あって、なんとか手元の local マシンで実験を回すことができ、銀圏までいけました。そこからは Go 株式会社の皆さんにチームマージをしてもらいました。チームメンバーが subsample でなく huggingface 上の元データを合わせるとスコアが伸びることを確認してからは、みんなで外部データを使用しました。hdf5 とローカルマシンの相性が悪く、言うほどデータのロードが速くならなかったので Google Cloud で GPU インスタンスを借りて取り組みました。最後は 1実験で20h とかかかってハードでした。

また、リーク騒ぎで2週間延長するなど大変でした。
(リークで伸びた期間で外部データの学習に気づき、やりきったチームに抜かされたりしました。延長がなかったらこのコンペで GM になれていたかも)

チームでの働きとしては、最後の方は自分の single model が少し弱く、アンサンブルしないよりかはマシ... くらいだったので悔しかったです。
しかしながら、個人的には事前学習済みのなんとか Net の finetune でなく、課題に合わせて自前で Conv Unit や UNet を実装する必要があって睡眠コンペの復習が活きたり、メモリアクセスレベルで実装を見直して高速なコードを書くために工夫ができて成長できました。


Eedi - Mining Misconceptions in Mathematics 🥇 (7/1446)

数学的な質問に対して1つの正解と3つの不正解で構成される多肢選択問題が与えられ、不正解の背景にある誤解 (Misconception) を予測するコンペでした。通称 Eedi コンペ。

GM まで最後の金メダルを目指し、3回ほど Public で金付近で終了し、shake down した惜しいコンペがありました。 復習が重要だということに気づいてから、直近の過去コンペで気になったソリューションを自分でも動かして latesub していました。 LLM の finetune については、atmaCup17 の latesub をして勘所を掴んでいました。
Retriever + Reranker という方針に気付き、Reranker の作成の部分にこの知識が活かせそうという仮説がハマって銀圏にいけました。この時ひたすらローカルの実験環境では、Reranker の finetune をやりながら、Notebook で Retriever model が公開されるたびに差し替えてスコアを伸ばしていました。 また後々のチームマージを見越して、vLLM で精度落とさず推論できるように準備したり、Retriever の実行を並行化 (cuda:0 と cuda:1 でそれぞれ実行) したり、推論コードの調整を進めていました。
未知 Misconception への対応、Retriever の自作、より大きな LLM の finetune などこれを一人でやり切ることは難しいと考えていてチームで取り組みたいと思っていました。
最初に睡眠コンペでご一緒した tereka-san とチームマージしてしばらく2人で取り組みました、その後 masaya-san, ahmet-san ともチームマージしました。 チームマージしてからは、全員のパイプラインの統合や高速化、推論結果の Ensemble など推論コードの実装メインに取り組みました。
一つ一つのパイプラインの実行時間が大きくなりがちな LLM コンペでしたが、うまく全員の実装を最終パイプラインに組み込めました。 この多様性も金獲得に効いたのではないかと思います。

GPU 関連では、Titan RTX 2枚で qlora の計算ができる LLM が 32B クラスまでだったため、72B クラスの LLM の finetune をするため、lambda labs の cloud で H100 インスタンスを立てて数日回しました。72B クラスだと1実験 70h ほどで $2.49/h だったので数日のラストスパート数万円と腹を括ったらまあ出せる額だなと思います。GCP とかよりは安いし、個人の所感ですが、初期のセットアップが楽チンでした。

たくさん議論ができ、とても楽しいコンペでした。


Kaggle の取り組み方

最近 Kaggle に参加するときにやっていたことをざっくりご紹介します。 とはいえ、あまり特別なことはなく、地道に積み重ねを行って、何かがカチッとハマった時に良い結果が得られてきたと思います。

まず課題と評価指標を理解する

何を解きたい課題なのかを確認し、データの説明を読み、評価指標を理解します。

データを俯瞰してみる

CSV データだったらスプシにコピーしてフィルタなどを使用しながら全体感を掴みます。 画像データだったら、VSCode で code <dir名> でサッと確認できます。

CV を構築する、コンペ固有でない方法を一通り試す

  • CV を構築してベースラインモデルを作ります。
    • Private test に unseen データがありそうなコンペの場合は、それを再現できるように試みます。
  • 推論時間の 9h に収まるように複数のネットワークをまわしてみてアンサンブルします。
    • 過去類似コンペのソリューションで有効だったものを色々試します。

計画を立てる

  • 一通り試してサチってきたら、上位との差分について考えます。
  • めちゃくちゃ離れている場合は、何か見落としがあるのかもしれないですし、近い場合はみんな似たり寄ったりなことをしているのかもしれないです。
    • Eedi コンペでは、Public 0.4 未満くらいまでは Retriever のみで到達するラインで、0.45 とか出している人は Reranker も作ってそうだなとか予想していました。

2ヶ月は取り組む

昔は 2週間チャレンジや 1ヶ月チャレンジをよくやっていました。
コンペが終わった後の悔しさや達成感、好成績を残した人へのおめでとうラッシュといった雰囲気が好きで、「はやく次のコンペに参加しよう、2ヶ月も待てないからあと1ヶ月くらいのものに出よう」という焦りから残り 1ヶ月くらいのコンペに繰り返し参加していた時期がありました。

この姿勢はハマる人にはハマるのかもしれないですが、自分にはあっていなかったです。どこがあっていなかったかというと、

  • コンペの復習が十分にできないまま、次のコンペに取り組んで学習効果が減ってしまう
    • そのため、類似コンペがあったときに強くてニューゲームができなかった
  • 1ヶ月しか参加しないので、時間が足りない
    • 2ヶ月、3ヶ月取り組んできた人に 1ヶ月で勝つのは難しい

最低2ヶ月は取り組んでいるコンペでは、安定した成績が残せているように感じます。 Eedi コンペは 2ヶ月ちょっと取り組みました。(後半ずっと緊張で嗚咽してました)

しっかり復習をする

個人的に最も成長できたポイントだと思っています。他の GM の方々も口を揃えて言っています。現行コンペに参加しているだけでワンチャンスある気になってしまいますし、現行コンペに参加していない間は停滞している気持ちになっていたのですが、結局急がば回れでした。

実際にやって効果があったと感じる復習

  • 睡眠コンペ
    • Conv Unit を重ねたシンプルな CNN ã‚„ UNet とか Attention (Transformer) のスクラッチ実装を色々試してみました。
    • ライブラリをポンとするだけでなく、GELU ã‚„ RELU、LayerNorm ã‚„ BatchNorm、GroupNorm など色々ある中で何をどう変えたらどれくらいスコアに影響するのか、の肌感を掴む目的で始めました。
    • パイプラインのモデル部分のみ差し替える形でパターンを変えて実行し、CV をみました
      • 3層MLP からはじめて Conv1d Unit、Attention のみ、UNet など
    • LEAP コンペで自力ネットワークこねこねの経験が活きました。
  • atmaCup17
    • 優勝解法が ktr さんによる gemma-2b-it の NSP タスクを lora tuning で実施するものでした。
    • このコンペには参加できなかったのですが、世は deberta 時代から大LLM時代になったのだなと痛感し、キャッチアップすることにしました。
    • Eedi コンペで大活躍しました。
      • LBに日本人アカウントが多かったのはこの Solution の影響が少なからずあったのではないかと思っています笑

スプレッドシートの活用

実験計画や気になった discussion やリンクなどをまとめたり、CSVデータをベタ貼りして俯瞰してみたり色々な用途に使っています。

実験計画やメモは コンペコードを置いている github の issue や slack、CSVデータの EDA は JupyterNotebook など色々使ってきたのですが、手間と便益のバランスがスプシはちょうどいい感じで使いやすかったです。簡単なフィルタとかできるのも good でした。

Kaggle で得られたもの

DS/ML のお仕事

まずこれです。当時は今ほど知の高速道路が通っておらず、また Kaggle 自体の知名度も今ほど高くなかったです。完全に先行者利益で今同じように Kaggle の成績のみで未経験で転職活動をしようと思うともっと良い成績が求められる可能性もあるのですが、自力で銅メダルを獲得できたことが MLE としてのファーストキャリアに繋がりました。

データ分析や機械学習の知識と実装経験

Kaggle はコードや解法を公開する文化とインセンティブが整っており、学びの場として素晴らしいです。著者実装がついていない最新の論文であっても、世界の誰かが Kaggle Notebook として公開していることがあります。0.001 の精度を競う場であるので、現行コンペであっても、最新の手法が出るとすぐ試されます。自分で論文を読んで実装するのが難しくても、誰かの実装を見つけて真似をすることでキャッチアップのハードルがすごく下がりました。

また、競技で成果を残した本当に効く手法を効率よく学べます。よく実務では 0.001 を追求する必要がないと言う批判がありますが、その通りな側面もあります。一方で、0.001 を追求するための引き出しを多数持っていることで、実務において必要な実装をクイックに引き出せるようになりました。

個人的な経験では Kaggle は実務の役に立ったなと思います。

Linux やハードウェア周りの知識

Kaggle で画像コンペや NLP コンペに参加するために自前の GPUサーバーを構築しました。
はじめはパソコン工房の BTO で組み立て済みのものを購入しました。コンペがインフレするにつれてどんどんスペックの良いPCが欲しくなりました笑 GPU を挿し替えたり、メモリや外付けのSSD を追加したり、パーツの変更も youtube などで一から勉強して自分でやりました。
互換性のないパーツを間違って買ったり、高いパーツを買ったのに動かなかったり色々なトラブルがありました。難しいことは多いですが、自分で PC が組めるようになる満足感や、クラウドのインスタンスを作成するときに「ああこれくらいのスペックか」と肌感が掴めるようになってよかったです。

とにかく初期費用がすこーしばかりかかることとちょっとトラブルがあるとめっちゃ焦ることを除いていいことだらけなので、GPU マシンがないと言っている方には「オンプレマシンはいいぞ!」とおすすめしています。

ちょっと前のブログ記事

また、Linux の知識についてです。自前でマシンを持つと動作する環境も自分の環境にあったものを自分で用意しなければなりません。OS のアップデートや cuda のアップデート、コンテナ上で作業するなら Docker など気持ちよく Kaggle するために色々準備が必要です。トラブルシュートも自分でやらないといけません。外付けのSSD が急に認識されなくなったり、なぜか急に電源が落ちたり... そう言ったものをシステムlog を見たり、コマンドで今つながっているのかどうか確認したりいろんな場面でコマンドを使います。最近だと ChatGPT に丸投げでなんとかなるようになりましたが、この辺りを自分でやったことがあるという満足感があります。

同好の仲間

当たり前のように業務外の時間を使って平日休日問わず Kaggle に夢中になっている皆さんです。自分が参加していないコンペであっても X で頑張っている姿を見たり、良い結果が出ていたりすると次は自分もと奮起できますし、コンペに限らずブログなどで知見を共有している人がいたりして刺激をもらえています。また、プライベートで仲良くしてもらえる友人もできました。社会人なって九州から単身出てきて、友人もあまりいなかったところから色んな方とオフラインイベントなどで出会い、個別に遊びに行くようになりました。

今後

Kaggle

コミュニティへの恩返しと次の目標を兼ねて Notebook, Discussion の GM を目指したいと思っています。

Baseline Notebook の投稿や、気付きを Discussion に投稿するなどやっていけたらと思います。

コンペには引き続き参加しますが、気になったコンペの latesub などにも力を入れていきたいです。

他のコンペへの参加

ソロ金含む4枚を集めてから GM になるまで他のコンペプラットフォームへの参加をやめていました。 atmaCup や yukiCup, probspace, nishika, solafune など色んなコンペに参加したいです。

MLOps やアーキテクチャ周りの実装

仕事でも少しやっていた pubsub などを使った負荷分散や、量子化や蒸留・軽量なローカルLLM を用いたオンライン推論ができるようなアプリケーション基盤などを自分で作りながら勉強したいと思っています。

おわりに

思いのほか長編になってしまいました笑
目標としていた Kaggle Competitions Grandmaster になれました。 自分一人の力では達成できなかったです。今までチームを組んでくださった方、勉強会や懇親会でお話をしてモチベーションをくださった方、Xでやりとりをしてくれた皆さん、最後にコンペ終盤に夜食を作るなどして支えてくれた妻、ありがとうございました。

Kaggle はもうすっかり生活の一部になってしまいました。これからもゆるく長く Kaggle と付き合っていきたいなと思っています。

ここまで読んでくださりありがとうございました mm
これからもよろしくお願いいたします!!🐸

GitHub Actions (GHA) に入門した

ブログのモチベーション

社のつよつよな同僚がすでに設定してくれていたワークフローをポチポチしたり、手順書にしたがってワークフローを編集する pull request を出すことはあった。

1から自分でできるだろうか、身についているだろうかという不安があったのでドキュメントを見ながら手を動かしてみた。

GitHub Actions

概要は公式 documentに詳しい。

GitHub Actions を利用するモチベーション

人間は手順書通りにやっても間違える。(N敗)

デプロイやコードの静的解析や単体テストといった繰り返し実行する必要のある手順を再現可能なワークフローとして管理できると安心できる。

2024年現在、GitHub でコード管理する現場はとても多い。GitHub 上でワークフローも定義して運用できるのは使いやすくて良い。

やった内容

入門に際して、公式で提供されているこちらのサンプルワークフローを追実装した。

サンプルでは Node.js をインストールしているが、筆者は python をよく利用するので python で Hello world を print する .py ファイルを書き出し、それを実行するように変更した。

name: learn-github-actions # ワークフローの名前、Actions タブにこの名前で表示される。
run-name: ${{ github.actor }} is learning GitHub Actions
on:
  workflow_dispatch: # Actions タブからポチポチでできるようになる。

jobs:
  check-python-version:
    runs-on: ubuntu-latest # github が提供するホストマシンのうち最新の ubuntu を指定
    steps:
      - uses: actions/checkout@v4 # リポジトリを runner が使えるようにするおまじない。コードに対して build とか test とかできるようになる。
      - name: hello world python file
        run: echo "print('Hello world')" > hello.py # Hello world を print するだけの hello.py を作成。
      - uses: actions/setup-python@v5 # job で python を使うためのおまじない。
        with:
          python-version: '3.10' 
      - run: python -v
      - run: python hello.py # Hello world を stdout に出力 

できたもの

まとめ

GitHub Actions に入門し、簡単なポチポチで実行できるワークフローを組めた。 今回は Actions タブからのポチポチで起動して Hello world を標準出力するだけのシンプルなものだったが、git の push や pull request や別のワークフローの実行終了などもできるらしい。 repository template にも組み込んで、kaggle の実装でも静的解析や型検査を使っていきたい。

参考にした URL

2023年を振り返る

kaggle

2023年はチーム銀2 (金からの shake down), ソロ銅2 という戦績でした。

これまで同一ホストが2回目3回目と開催していて、王道のアプローチやソリューションが出揃っていたりTransformers のモデル順番にぶん回せばよい評価指標 RMSE の NLPコンペなど計算量とマイナーチェンジによる多様性でなんとか逃げ切れるようなコンペを選んでいました。

昨年ソロ金を取得したこともあり、これまであまり手をつけてこなかったお題のコンペにも挑戦しながら、GMに必要な5枚目の金メダル獲得を目指したものの金メダルに手が届きそうで手が届かず(Public 金からの shake down銀)悔しい思いをした1年でした。

記憶に残っているコンペについて書いていきます。

 

Hubmap チーム銀

ソロ金獲得のためのチームマージ縛りを解いて初めてチームアップしたコンペでした。

医療画像(細胞組織)のインスタンスセグメンテーションのタスクで、画像コンペは分類タスクしか参加してこなかったので学びが多かったです。

使い勝手がよいらしいと聞いていた mmdetection をはじめて使いました。ちょうど mmdetection 2系から3系の過渡期で 2系で書かれた過去のソリューションの内容を3系のドキュメントを見ながら実装するような形でキャッチアップし、銀圏上位に到達したあたりで上位のチームとチームマージしました。チームメイトたちのパイプラインが 2系で私が 3系だったこともあって、アンサンブルに苦戦しました。

まず同一の推論ノートブックで 2系の推論と3系の推論を実行する必要がありました。

どちらかに統一する方法も試しましたが、2系の実験結果が3系で、3系の実験結果が2系で再現できず断念しました。

チームメイトが 2系と3系の推論を両立できるように依存を整理してくれ解決しました。

次に推論結果をアンサンブルするところです。

インスタンスセグメンテーションでは予測結果に 座標の bbox とセグメンテーションマスク (と id) が出力されます。

これらをメモリに持っておくと 2系と3系の切り替えまで持ち続けるにはメモリが持たず、2系と3系の切り替えが必要な関係で、一回の推論ループ内で両方の推論をするのが難しいという問題がありました。

試行錯誤の結果、2系の推論結果を一回バイナリにエンコードして3系の推論中にデコードして混ぜるという複雑なことをやりました。エンコードしてデコードしても推論結果の同一性を担保しつつアンサンブルがうまく行ったのは気持ちよかったです。

このコンペでは、CVとLBで改善が見られるという怪しい処理が共有されていました。この怪しい処理は結果として private では効かないものでした。

それに頼ってスコアを上げながら金圏ボーダーを争っており、最後の最後でこの怪しい処理に頼っていていいのか不安になって急ごしらえで作った守りのサブで銀圏までのシェイクダウンで済んだという結果でした。

TrustCV だけでなく、なぜ効いてるか直感的でない怪しい処理は使うものではないなという教訓を得ました。

 

睡眠コンペ チーム銀

お題は睡眠時に装着する加速度センサー? のセンサーデータから起きたイベント、寝たイベントを検出するもので、自分にとってはあまり取り組んでこなかったタスクでした。Twitter の TL で盛り上がっていて、少しずつ公開 notebook で勉強していました。残り1ヶ月のところで激強 pipeline が公開され、その触り方に慣れてきで銀圏上位にスコアが乗ったタイミングで LBの上の方にいたチームの方々とチームを組んでもらいました。最終的に5人のチームとなり、それぞれの自前の pipeline をお持ちの2名と激強 pipeline ベースの3名(kaeru 含む)で進めていました。久しぶりの5名チームで評価関数をよく理解したアプローチやドメイン固有の後処理などチームメンバーのアイデアや実装力にたびたび助けられながら取り組みましたが、最後は shake down してしまいました。

ソリューションを見ると多様なアプローチが存在していました。復習や基礎を勉強し直すのによい教材だと思い、今はじっくり勉強をし直しています。


CTFコンペ ソロ銅

Capture The Flag (CTF) というセキュリティ技術版の kaggle みたいなものがあり、それが kaggle 内で開催されていたので興味があってでました。

情報セキュリティに関する問題で、かつ機械学習やコンピュータビジョンに関係がありそうなものが全27題出題されました。早い者勝ちで最も多くの問題を解いた人から賞金とメダルが獲得できる & 激しい計算リソースが必要ないひらめき勝負ということで参加しました。

開催期間中のコードやアイデアの共有が禁止されていたこともあって、難しかったですが、

GPT っぽい API に対する攻撃や xml インジェクション、Adversarial Attack の基本などが学べてよかったです。

 

本

(前年個人比)で技術書をたくさん読みました。輪読会のお題であったものから自分で選んだものまで、通しで読めたものからつまみ食いしたものまで色々読みました。型、テスト、基盤、Linux やGPUなどソフトウェア開発やハードの方面まで色々な関連技術に興味を持って読んだ内容が自分の中で繋がっていって楽しかったです。

 

仕事

昨年11月に転職した会社に引き続き在籍しています。勤続1年と1ヶ月です。はじめの半年は MLE としてモデリングをメインに、データアノテーションを社内の別のチームに依頼するところから、MLOps のチームが整備運用してくれている MLの推論基盤にデプロイまでして、あとはお客さんの手元に機能が届くところまでの各チームとの調整といった業務に取り組んでいました。現在までの半年は、MLOps エンジニアとして、推論基盤の作成や再学習基盤といった Google のサービスを組み合わせて MLモデルを運用するための仕組みの実装に取り組みました。MLOps とても楽しいです。また、エンジニアとして自分1人だけの視点のみならずチームの拡大や成長のためにできることを考えて動くことにもチャレンジしました。カジュアル面談や面接といった採用活動への参加や、新しく入ってくれたメンバーがすぐ活躍できるよう環境構築用のコンテナ環境を整えたり、オンボーディング資料を作ったりしました。まだまだ手が届かないところも多いですが、「個から組織に目を向けてできることからやっていく」は継続したいと思います。

 

プライベート

結婚して、新婚旅行に行って、引っ越し先も決めて人生が大きく動きました。

 

まとめ

2023年はプライベートが大きく動きました。

kaggle では GM チャレンジ継続中で、金圏からの shakn down で銀圏という悔しい結果が 2度続きました。触ったことがないようなお題のコンペにも取り組めて楽しかったです。

本も読みました。仕事についてもできることも視点も拡がってまだまだやることがありそうです。

2024年はまず GM になりたいです。

ありがとうございました。

Kaggler なら知っておきたい GPU の話

Kaggle アドベントカレンダー2023 の 12 日目の記事です。

一般販売向けの GPU の技術仕様の読み方や GPU の仕組みについていろいろ勉強して社内の勉強会で発表しました。

その資料をベースに磨き込んだ内容をお届けしようと思ったのですが、間に合わなかったので スライドの内容をそのまま共有します。🙇

オンプレ GPU を買いたくて HP とか見ているけどわけわからんと悩んでいる方、 よくわからんけど強いんやろ!!って普段使っている A100 や V100, T4 がどんな仕組みで動いているのかとかに興味がある方に届くと嬉しいです。

最初の方で紹介している Flash Attention の論文は、Attention の計算のメモリ効率を改善するためにハード面に目を向けた面白い論文です。CPU ←→ GPU のメモリ間のデータ転送の仕方を工夫するために CUDA 内部で記述されている計算処理を工夫してメモリ効率を高めています。

新しい torch 2系では(使用可能な場合)デフォルトでこの Flash Attention が適用されるので torch をアップデートすれば恩恵を受けられますが、裏ではこのような工夫がされているんだな〜と知っていると見え方が変わるかもしれません。

(超人 kaggler の中には cuda kernel の実装を修正してモデルの計算速度を改善している強者もいるらしいです (すごい))

speakerdeck.com

2022年を振り返る

お久しぶりです。 kaerururu です。

2022 年の振り返りをしようと思います。


kaggle

2022 年は ソロ金 1, チーム金 1, ソロ銀 1, ソロ銅 3 に加えて, kaggle days championship final 出場という戦績でした。 他にもメダルは取れなかったけどやりきったコンペが一つありました。(訳あって戦績からは抹消されていますが...)

2021 年末に掲げた ソロ金を獲る を達成できました。あと金メダル一枚で GM です。


PetFinder.my - Pawpularity Contest (5/3537)

  • result : 金
  • member : yuki-san, tommy-san, cpptake-san, shokupan-san
  • ジャンル : 画像
  • 通称 : Pet コンペ 2

保護動物の里親探しのサイト主催で, 与えられた犬猫画像に対して独自に定義された連続値である可愛さスコア(Pawpularity) を予測するコンペでした。

ターゲットがノイジーで同コンペで与えられた同一・類似画像で異なる値がついていたり, train データが 9900件程度しかないこともあり, 与えられた画像のみを Deep de pon するだけでは運要素の非常に強いコンペでした。

しかしながら, 過去コンペである pet1 コンペで与えられた画像との被りがあり, 類似度でマッチする過去コンペ画像に紐つくメタデータを特徴量に加えるとスコアが跳ね上がったり, 最終的に private 1st になったのは事前学習済みモデルから抽出した embedding を rapids の SVR で学習したモデルでした。

銅メダルをふらふらしていたところ上述の 4人のチームに誘われました。当時 public 2位で, 同ホストの前回コンペ 1st だったことを買ってもらったそうです。当時ソロ金のためにチームマージ縛りをしていたのですが, 欲に負けてお受けしました。(2位に声かけられたら断れない...)

チームマージしてから過去コンペで効いた特徴量を加えたりして public 1st まで登りつめました。最後 3週間くらいは stacking と blending を混ぜたり, 最終サブ選びについて考えたり, ひたすら shakedown 対策をしていたのですが, 最後の最後で shakedown して 5位で finish しました。

日本人大勢でわいわい取り組む久しぶりのコンペでした。


Jigsaw Rate Severity of Toxic Comments (95/2301)

  • result : 銅
  • member : ソロ
  • ジャンル : NLP
  • 通称 : jisgaw 4コンペ

与えられたテキストの毒性スコアを当てるコンペ。学習用データセットは与えられず, これまでに同ホストより開催された3回のコンペのテキストを使用することを指定されました。また正解データはスコアとしては与えられず, more toxic と less toxic のテキストのペアが与えられていました。このため pairwise 学習などの工夫の余地があり楽しそうなコンペでしたが, (記憶がほとんどないが) LB が壊れており, trust cv が求められたコンペでした。


BirdCLEF 2022 (68/807)

  • result : 銅
  • member : ソロ
  • ジャンル : 音
  • 通称 : 鳥コンペ3

ハワイに生息する鳥類の音声サンプルを使ってモデルを学習し、5sec clip の環境音サンプルに、それぞれの鳥類が鳴いてるかどうかを当てるコンペでした。

2021コンペで与えられた validation 用の環境音データがなく, さらに CV 計算用の関数が与えられず (強いて言えば macro F1 が近いよ!とのこと) 手元 CV が計算できない上に, class inbalance であったとても難しいコンペでした。

オチとして同ホストが鳥類の音声データで事前学習した(コンペデータは学習に使っていないらしい) BirdNet を使った solution が金圏 finish していました。

個人的には, transformer base の音声モデルを試したり, 鳥2までの延長線上の手法をポンしてスコアが伸び悩んで終わりました。

他にも少数サンプルデータをハンドメイドでアノテーションした解法が金圏 finish していたので次あったら試してみたいです。


Foursquare - Location Matching (76/1079)

  • result : 銅
  • member : ソロ
  • ジャンル : マッチング
  • 通称 : 4sq

位置情報サービス提供者がホストのコンペで与えられた地点データの中から同じ場所を表す地点をまとめるコンペでした。色々やらかしがあってとても賑わったコンペでしたが, knn や faiss などで候補集合を作成し, 決定木で同じか同じでないかの 2値分類問題を解くような多段アプローチが必要なコンペはあまり出たことがなかったので新鮮でした。(landmark はデータ重かったり TPU の学習コストが云々言い訳して避けてきました) またメモリ管理が難しくこのコンペの感想戦で教えてもらったメモリ管理手法は学びでした。


Feedback Prize - Predicting Effective Arguments (136/1557)

  • result : 銅
  • member : ソロ
  • ジャンル : NLP
  • 通称 : FB2

アメリカの学生が書いた小論文を discourse elements ごとに Ineffective, Adequate, Effective の項目ごとにスコアリングするコンペでした。

deberta-v3 family が強いことや tokenizer に独自トークンを追加したりする手法などを学びました。


Feedback Prize - Predicting Effective Arguments (13/2654)

  • result : 金
  • member : ソロ
  • ジャンル : NLP
  • 通称 : FB3

アメリカの学生が書いた小論文を cohesion, syntax, vocabulary, phraseology, grammar, conventions の項目ごとにスコアリングするコンペでした。

与えられた学習データが 4000件程度だったり, 6項目の RMSE の平均が評価指標だったりただでさえ shaky な要素が揃っていたのですが, その上 public LB の表示桁数が小数点下2桁まで + ハイスコア public notebook の存在で public LB が信用ならない状況でした。

コンペ終了10日前くらいに金圏に到達し, 最後までボーダーラインをふらふらしていたのですが, shake しないように diversity 確保と trust cv に全振りしました。その甲斐あって public, private 両方とも金圏に残ってのソロ金獲得できました。

前回コンペのソリューションや, 同じテキストの回帰問題であった commonlit コンペのソリューションを片っ端から試したり, kaggle notebook 環境のメモリ管理のため個別の script で実行するなど, 過去参加した全てのコンペでの学びを発揮できたコンペでした。

また, コンペ中に TitanRTX を増設し VRAM 48GB を手にしました。


DFL - Bundesliga Data Shootout (-/530)

  • result : -
  • member : ソロ
  • ジャンル : å‹•ç”»
  • 通称 : DLF

ドイツのサッカーリーグ主催で動画データ内の特定のプレーとその発生時点を予測するコンペでした。

今まで取り組んだことがなかった動画データのコンペであったのと LB 公開が待てなくて参加していなかった 2stage 制のコンペであったことからチャレンジしてみたのですが, げきつよ公開notebook に蹂躙され銀圏にも残れなかった上に, 学習済みの重みを全て消してしまい rerun 時に落ちてスコアが出ない結果となりました。(無念)

散々な結果でしたが EDA でサッカーのプレイ動画を見るのは楽しかったので類似コンペがあったらチャレンジしたいです。


Kaggle championship final

昨年参加した予選で参加資格を得たので決勝大会参加のためスペインのバルセロナに行ってきました。コンペ自体は 11h で同時に 2コンペ開催というハードなものだったのと盛大な shakedown で残念な結果でしたが, 初海外に行けたのは思い出深かったです。チームメイトだった takuoko-san, upura-san, ynktk-san には感謝です。


仕事

2年3ヶ月お世話になった六本木の web 系企業を退職し, 11月から下町のベンチャー企業に転職しました。その会社では 4月半ばから半年にかけて業務委託として参画させてもらい正社員になったらどんな人とどのように一緒に働くことになるのか具体的なイメージを持って転職することができました。

自分のキャリアで全く関わってこなかったドメイン知識を必要とする会社ですが, 尊敬できる同僚に囲まれながら日々楽しくコードを書いています。


その他

昨年の抱負でも書きました仮想通貨 bot 作成に 2ヶ月くらいチャレンジしました。 ネットで拾ったり自分でアイデアを出して取引戦略を立てる, その取引戦略で実際に勝てるのか時系列でデータを分割し, シミュレーションを実施する。 その取引戦略に基づいて 取引所の API を使用し注文を出し実際に市場でトレードするというところまではできました。

金融のドメイン知識を獲得し, より複雑なアルゴリズムの構築にチャレンジすることやクラウドにインスタンスを建てて取引ログを DB に保存するといったシステム構築までやってみたかったのですがのめり込めず途中でやめてしまいました。


来年の抱負

最後に来年の抱負も書いておきます。

  • 金メダルを獲得し, Competition GM になる
  • チームマージをして色々な人とコンペに参加する
  • やった事ないコンペにも参加し, コード資産を拡充する
  • テストコードを個人開発で書く習慣をつける
  • OSS にコミットする

以上です。

ありがとうございました。

PC構築初心者による Kaggle 用 オンプレ GPU マシン組み立て事始め

はじめに

こんにちは, kaerururu です。この記事は kaggle アドベントカレンダー 2022 12/05 分です。 この度 PC構築初心者の私が, 自宅の Kaggle 用 TitanRTX 1枚挿し GPU マシンを増築して TitanRTX 2枚挿しにしました。その過程で得た知見 (パーツ選びの際に気をつけることやハマりポイントなど) を書いていこうと思っています。


想定読者

  • オンプレ GPU マシンを作りたいけどパーツの選び方とかわからないよっていう人
  • BTO で PC 買ったけど, スペックを上げたいなと思っている人
  • 計算機そのものも欲しいけど, パソコン自分で組み立てること自体に興味が持てる人 (重要)

筆者とオンプレマシンについて

  • 機械いじりド素人
  • GCP などのクラウド資源だとコスト気にして実験に集中できないよと思い, 2020å¹´? くらいに BTO で GPU マシン(GeForce RTX 2080ti * 1, GPU 11GB, メモリ32GB) 購入 (33万)
    • 機械いじりに自信なく高い買い物して動かなかったらショックだったので, BTO で購入。
  • 11GB じゃもの足りなく感じ中古で Titan RTX 購入 (40万)
    • 当時最も半導体が値上がりしていたので中古で 40万とかなり下手くそな買い物になりましたがそのマイナスを差っ引いても満足度の高い買い物でした。
    • GPU の挿し替えのため, 初めてパソコンのケースを開けました。
  • メモリが貧弱で GPU に乗せる以前の処理がボトルネックになっていたことが判明, 追加で 16GB * 2 購入。ようやく回したい実験をストレスなく回せるようになりました。
    • メモリのスロットが 4箇所あり, うち 2箇所は買った時点で埋まっていたのですが, 残りの 2箇所に挿すだけでした。
  • 24GB だけでもコンペを選ばなければ, 現実的な実行時間でコンペに取り組めていましたが, もう少しマシンパワーが欲しくなり追加で中古 Titan RTX 購入 (30万くらい)
    • それに伴い, マザーボード, 電源, CPU, ケースなどを追加購入
    • 初の大規模な増築でした。

筆者の PC の中身 なかなか散らかっている


本題

ここからは, パーツそれぞれについて選び方やハマったポイントを書いていきます。

最小構成といって, マザーボード, CPU, CPUファン(グリスも), メモリ, 電源, (GPU) が用意できれば起動して Bios 画面に移行できるので最低限のパーツについて紹介します。

GPU

  • Kaggle 用マシンにおいて最も重要でお金のかかるパーツ
  • 筆者は買い物が下手くそなので中古で合計 70万円使って Titan RTX (24GB) ものを 2つ買いました。
  • 筆者の所感ですが, GPU 選びのポイントは

    • 1枚で最低 24GB あると望ましい, 16GB 未満なら自宅マシンをあえて作る必要性を感じないレベル
      • GCP で比較的価格を抑えて instance を作成するときに選ぶであろう T4, P100, V100 は1枚あたり 16GB
    • 2枚以上の場合は, nvlink という専用のブリッジ (まあまあ高い) ã‚’ 2枚の GPU に接続して仮想的に 1枚の GPU として扱うか, GPU を使うソースコード側で DDP という 2枚の GPU を勾配などを共有しながら使用するような実装をする必要があり面倒くさいです。
    • 複数挿しにする場合は,
      • 電源を電力をたくさん供給できるものにする (TitanRTX 一枚の時は 750W, 2枚の今は 1250W のものできちんと動いています)
      • GPU 2枚が挿さるマザボ, GPU 2枚挿さっているマザボとコードがしっかり収まるケース
      • 冷却設備 (空冷・水冷など, 後述)
      • なども用意する必要があります。
  • よく見る GPU たち

GPU メモリ (GB)
RTX 3080 10
RTX 3080ti 12
RTX 3090 24
RTX 3090ti 24
Titan RTX 24
RTX A4000 16
RTX A4500 20
RTX A5000 24
RTX A5500 24
RTX A6000 48
  • 参考 : GCP で選べる GPU たち
GPU メモリ (GB)
NVIDIA K80 12
NVIDIA P4 8
NVIDIA P100 16
NVIDIA V100 16
NVIDIA T4 16
NVIDIA A100 40

電源

  • 規格
    • 1250W Gold のように書かれていて, W は文字通り電力量, プラチナとかゴールドなどが書かれているのは電力への変換効率だそう。
  • 選び方
    • GPU は電力消費が激しいので, たくさんの電力を供給できる電源を用意する必要がある。
    • 筆者の環境では, TitanRTX * 1 -> 750W, * 2 -> 1250W でしっかり動いています。

マザーボード

  • 規格

    • ATX、microATX、Mini-ITX などがあり, 左に行くほど大きい。
    • 筆者は BTO 購入時についていた microATX に GPUã‚’2æžš, メモリを4枚挿して使用。(あまりオススメしない)
  • 選び方

    • GPU が 2枚挿さりそうな大きいもの
      • ただ2枚挿さるだけでは冷却性能の観点で不十分かもしれない, 空間的余裕が欲しい
      • GPU の温度が上昇しすぎると性能が落ちたり壊れたりするらしい...
    • メモリが 4枚以上刺さるもの
      • スロットの他に, 積める最大メモリ量というものが決まっており, 筆者の microATX マザボでは最大で 64GB までしか載せられない(とても困る)
  • やらかし

    • マザーボードによって対応しているメモリの規格 (DDR4 2666 みたいな), CPUソケットの規格 (LGA~) などが決まっているため, すでに持っているパーツを流用したい場合は気をつけて選びましょう。 (1æ•—)

CPU, CPU ファン, グリス

CPU

  • 規格
    • intel core i5 とか core i7 とか聞いたことのある人も多いと思います。
    • core i7-9700 みたいな感じで, i7 がグレードで 9700 が世代です。
    • AMD Ryzen シリーズもありますが, Ryzen は買ったことがないので何とも言えません。
  • 選び方
    • core i7-9700 を筆者が使用していますがこれといって不便は感じていません。- 並列数やらで選ぶといいらしいです。
  • やらかし
    • CPU とマザーボードを一気に新調しました。しかし, 起動テストで Bios 画面に移行せず, ネットで調べると CPU かマザーボードのどちらかに原因がありそうというところまでしかわからなかったため, どちらも返品しました。初心者の人は片方ずつ新しいものを用意して, どちらかは必ず動くことが担保されている状態で新しいパーツを購入した方が良さそうです。

CPU ファン

  • 概要
    • CPU につけて冷やす役割
  • 選び方
    • CPU にセットになっているものもあるが別途買った方がいいらしい。CPU は高温になりすぎると PC が落ちたり, 壊れたりするのでよく冷やしましょう。ファンを別途購入する場合, 対応する CPUソケットのものを買いましょう。筆者は自分で組み立てられて ryzen, intel, 複数のLGA規格に対応できるものを買いました。ファンも2つついてます。

グリス

  • 概要
    • CPU とファンの間に塗る粘土みたいなもの。CPU からファンに熱を逃がす役割がある。
  • 選び方
    • ファンに最初からついてるものもありますが, 別途購入した方がいいらしい。筆者は 400円くらいものを購入。

メモリ

  • 規格
    • DDR4 2666 のように決まっていて, それぞれ世代, 周波数を意味します。
  • 選び方
  • やらかし
    • DDR4 だけに注意して DDR4 3200 のメモリを購入, 3200 はマザーボードに対応していなく挿しても PC が認識しませんでした。
    • メモリを挿す場所が複数ある場合は, 挿す順番も決まっており, 間違ったところに挿しても PC が認識しません。

ケース

  • 選び方
    • マザーボードに対応しているものが良い (ATX 用とか)
    • 冷却性能に不安がある場合はファンがついてるものとか
    • 光るものもある (光らなくても良い, 電気代を考えると寧ろ光らないほうが良い)
    • 究極なくても問題ない
      • オシャレな剥き出しマシン (埃とかの掃除大変そう)

筆者の完成した PC (カッコイイ)


最後に

  • 色々書いてきましたが, マザーボード, CPU, メモリなどそれぞれこの規格でないと動かないなどの罠が多く, 初心者には難しいです。
  • 初期費用を抑える -> 手元の環境じゃ満足できなくなって増築を繰り返してきました。増築のプロセスは工作みたいで楽しいですが, 時間かかりますし間違ったパーツ買った時のショックは大きいです。
  • 自宅 GPUマシンを購入するなら腹を括って LambdaPC を買ってしまった方が良いです。(今なら RTX A5000 (24GB) 2枚挿しで 140万円くらい)

参考URL

追記

  • 2022/12/05
    • nvlink 周りの記述が正確ではないため, 取り消し線しました。