機械学習の案件で予算が溶ける理由は、普通のシステム開発とは別のところにあります。
普通の開発なら、作るものが決まっていれば工数はある程度読めます。機械学習では、作るものが決まっていても何回試すかが決まりません。ここが読めないまま見積もりを出すと、後から必ず足が出ます。
私も何度かやりました。この記事では、機械学習の案件で予算が膨らむ三つの経路と、それぞれに対して今やっている対策を書きます。予算管理そのものの考え方はプロジェクトの予算管理の重要性に、見える化の手順はコストを見える化:プロジェクト予算を簡単・効率的に管理する方法にまとめてあります。
目次
1. 試行回数を決めないまま始めると際限がなくなる
機械学習の作業は、一発で当たる前提の仕事ではありません。特徴量を変え、モデルを変え、ハイパーパラメータを変えて、繰り返し試します。
ここで問題になるのは、「もう少し試せば良くなるかもしれない」という状態が延々と続くことです。精度が目標に届いていないとき、あと一回試す判断をするのはとても簡単です。そして、その一回が何十回にもなります。
私が関わった案件で、当初2週間の想定だったモデルの改善が2か月近くかかったことがあります。毎週「あと少しで届きそう」という報告が上がってきて、それが8回続いた形です。誰も嘘をついていません。実際、毎回少しずつ良くなっていました。ただ、伸び幅は途中から明らかに鈍っていて、そこで止める判断を誰もしていませんでした。
今やっているのは、試行回数を工数の単位として見積もりに書くことです。「特徴量の検討を10パターン」「モデルの比較を5種類」のように、回数として計上します。
そのうえで、打ち切りの条件を先に決めます。「直近3回の試行で改善幅が1ポイント未満なら、そこで現状のモデルを採用する」といった形です。これを事前に合意しておかないと、止める判断が誰かの敗北宣言のようになってしまい、余計に止まらなくなります。
2. 計算リソースは作業していなくても増える
人件費は誰かが働いた分だけ発生しますが、クラウドの計算リソースはそうではありません。起動していれば増えます。
一番間抜けだったのは、学習用に立てたGPUインスタンスの止め忘れです。学習が終わった後もそのまま起動していて、気づいたのは数週間後でした。その間、作業としては何も進んでいません。
これは仕組みで防ぐしかないと思っています。今は次のようにしています。
- プロジェクト単位でタグを付ける。案件ごとの費用が分離できていないと、そもそも異常に気づけません。
- 金額でアラートを設定する。想定の月額を超えたら通知が来るようにします。閾値は雑でよくて、早く気づくこと自体に意味があります。
- 学習ジョブの終了時に停止する運用にする。手動での停止に頼ると、必ず忘れます。
もう一つ、見積もりの段階で見落としやすいのがストレージの費用です。学習データの中間生成物や、試行ごとのモデルの重みは、放っておくと溜まり続けます。一つひとつは小さいのですが、試行回数が多い案件では無視できない量になります。不要になったものを消す作業を誰の担当にするかまで決めておかないと、誰も消しません。
3. 見積もりから抜け落ちるデータ整備の費用
三つ目が、実は一番大きいかもしれません。
機械学習の案件で工数を見積もるとき、モデルを作る作業には自然と目が向きます。ところが実際に時間を食うのは、その手前のデータ整備の方です。欠損の処理、形式の統一、重複の除去、そしてラベル付け。
特にラベル付けは、外注する場合は直接の費用として、内製する場合は工数として、まとまった額になります。しかも、着手前には必要量が読めません。データを見てみたらラベルの基準が揃っておらず、全件付け直しになった、という経験もあります。
対策として今は、契約前に少量のサンプルを見せてもらうようにしています。全量である必要はなく、数百件で十分です。ここを見ずに出した見積もりは、かなりの確率で外れます。
それでも読み切れない部分は残るので、データが想定と違った場合の扱いを事前に決めておきます。ラベルを付け直す工数は誰が持つのか、それともスコープを縮めるのか。決めていないと、その場の流れで自社が吸収することになります。このあたりはリスク管理の話でもあるので、リスクマネジメントの役割とプロジェクトの成功にも書きました。
4. フェーズを切って見積もる
ここまでの三つに共通する対策が、フェーズを分けることです。
機械学習の案件を最初から最後まで一括で見積もるのは、実際にはかなり無理があります。データを見ていない段階では、必要な試行回数もデータ整備の量も分からないからです。分からないものを見積もると、大きめのバッファを積むか、外れるかのどちらかになります。
今は、まずデータの調査だけを短期で切り出して、そこで見えたことを踏まえて次の見積もりを出す形にしています。調査フェーズで「このデータでは目標に届かない」と分かるなら、そこで止める方が双方の損失は小さくて済みます。
顧客側にとっても、この方が悪い話ではありません。一括で受けてしまうと、無理だと分かった後も走り続けることになります。実際、調査の段階で方向を変えた案件はいくつかありますが、後から振り返るとどれも早く判断できてよかったものばかりです。
そして、予算という制約があること自体がスコープの歯止めになります。「もう少し試せば」が止まらないのは、止める理由がないからです。使える額が決まっていて、それが見えていれば、止める判断が個人の感覚ではなく計算になります。
5. まとめ
機械学習の案件で予算が膨らむ経路は、私の経験では次の三つです。
- 試行回数が決まっていない。「あと少し」が積み上がる。回数を工数として見積もり、打ち切り条件を先に決めておく。
- 計算リソースが作業と無関係に増える。タグとアラートで仕組みとして拾う。
- データ整備の費用が見積もりから抜ける。契約前にサンプルの実物を見る。
そして、これらをまとめて扱う方法がフェーズを切ることでした。分からないものを分からないまま見積もらない、というだけの話ですが、これが一番効いています。
予算管理がなぜマネージャーの仕事なのかという入口はプロジェクトの予算管理の重要性に、実際の見える化の手順はコストを見える化:プロジェクト予算を簡単・効率的に管理する方法にあります。予算を含めた管理全体の枠組みはITプロジェクトマネジメントの基礎とその重要性を参照してください。