← 一覧へ
連載 Agentic OS:技術スタックを下から読む の一部です ―― 目次を見る →

Agentic OS 技術スタックを下から読む 補講(4):一つのモデルを、多くの機械へ広げる ―― 計算は割れる、通信は割れない

この記事の読み方
前回は、言葉の刻みで、いちばん下を見ました。

Agentic OS 技術スタックを下から読む 補講(4):一つのモデルを、多くの機械へ広げる ―― 計算は割れる、通信は割れない

補講、四つ目 ―― 一つのモデルを、多くの機械へ

前回は、言葉の刻みで、いちばん下を見ました。

一つの文を、そのまま機械に渡すのではありません。まず細かい切れ目に分けます。その切れ目に番号を付けます。番号の列として扱えるようにします。そこまで下りて、言葉が計算に入る入口を見ました。

補講は、まだ続く。

今回は、同じく下です。ただし、見る面が違います。今度は、鍛える側です。

一つのモデルが、大きくなりすぎると、一台の機械には収まりません。重みも多すぎます。途中で使う作業用の置き場も足りません。計算の量も、一台では何週間も何か月もかかります。

そこで、多くの機械に広げます。

ただし、機械を増やせば、そのまま速くなるわけではありません。計算は割れます。けれど、割ったものは、あとで揃えなければなりません。この揃えが重くなります。

ここが今回の主題です。

まず、計算を割る ―― 三つの割り方

大きなモデルを鍛えるとき、計算の割り方は、大きく三つあります。

一つ目は、同じモデルの写しを、何台にも置くやり方です。

それぞれの機械には、同じ重みがあります。ただし、食わせるデータの束は違います。ある機械は一つ目の束を見ます。別の機械は二つ目の束を見ます。さらに別の機械は三つ目の束を見ます。

同じ問題集を、何人にも配るのに近いです。ただし、各人が解くページは違います。みんなが同時に解けば、短い時間で多くの例を見られます。

二つ目は、一つの層の中の計算を、横に切るやり方です。

層とは、入力を受け取り、重みを使って、次の形に変える一段のまとまりです。その中では、大きな表のような数の塊を使って、多くの掛け算と足し算をします。この一段が大きすぎると、一台では抱えきれません。

そこで、表を列や行の方向に分けます。ある機械は左側を持ちます。別の機械は右側を持ちます。それぞれが自分の持ち分を計算します。あとで断片を突き合わせます。

三つ目は、層そのものを機械ごとに分けるやり方です。

前の層を持つ機械が計算します。終わったら、結果を次の層を持つ機械へ渡します。次の機械がまた計算します。さらに次へ渡します。

これは、流れ作業です。一つの品物が、前の作業台から次の作業台へ渡っていく形です。

第3回では、鍛え終わったものを使う側で、仕事をどう割るかを見ました。今回は、その手前です。そもそも、その大きなものをどう鍛えるかです。

どの割り方でも、計算そのものはかなりきれいに割れます。手は増やせます。問題は、そのあとです。

だが、割ると、揃えないといけない

一つ目の割り方を、もう少し細かく見ます。

同じモデルの写しが、別々のデータの束を見ます。すると、それぞれの写しは、今の重みをどう直せばよいかを計算します。

この「どう直せばよいか」は、向きと大きさを持っています。間違いが減るほうへ、少しだけ動かすための指示です。ここでは、難しい言い方は要りません。こう直せ、という方向です。

ただし、各機械が見たデータは違います。だから、出てくる方向も少しずつ違います。

ある機械は、こちらへ直せと言います。別の機械は、少し違う方向へ直せと言います。さらに別の機械は、もっと別の癖を持った方向を出します。

ここで、各機械が勝手に重みを直してしまうと、同じモデルの写しではなくなります。最初は同じだったのに、一歩進んだだけで別物になります。次の一歩では、もう同じ訓練をしているとは言えません。

だから、全員の出した方向を集めます。足し合わせます。平均します。そして、その平均した一つの方向を、全台に配り直します。

全台が同じ方向で、同じだけ重みを直します。そうして初めて、写しはまた同じ状態に戻ります。

この揃えは、一歩ごとに必要です。

計算だけなら、各台が勝手に進めます。けれど、同じ一つのモデルを鍛える以上、勝手には進めません。手分けして計算したあと、必ず一度集まって、同じ状態に揃えます。

通信が、律速になる

ここで、重いものが出てきます。通信です。

通信とは、機械どうしが数の塊を送り合うことです。ここで送るものは、小さな合図ではありません。重みと同じ形をした、こう直せという方向です。モデルが大きければ、この方向も大きくなります。

一歩ごとに、各機械はこの大きな塊を外へ出します。ほかの機械からも受け取ります。足し合わせます。平均したものを全台で共有します。

計算は、GPUの中で速く進みます。数を掛け、足し、次々に処理します。ところが、機械の外へ出ると、話が変わります。線を通して送れる量には限りがあります。途中の受け渡しにも時間がかかります。

第39回で見た土台の話が、ここに戻ってきます。計算そのものより、運ぶことが先に詰まる、という話です。今回は、その訓練版です。

各機械は、自分の計算を終えても、すぐ次へ進めません。ほかの機械の方向が届くのを待ちます。平均ができるのを待ちます。新しい重みが揃うのを待ちます。

その間、計算する力は余っています。手は空いています。けれど、進めません。

台数を増やすと、計算の手は増えます。見るデータの束も増やせます。だから、速くなるはずです。

しかし、台数を増やすほど、揃える相手も増えます。送る経路も増えます。届くのが遅い機械を待つ場面も増えます。

ある所から先は、機械を足しても伸びが鈍ります。計算の増え方より、揃えの重さが目立つからです。分散訓練の難しさは、ここにあります。

横に切ると、もっと話す

二つ目の、一つの層を横に切る割り方は、さらに通信が濃くなります。

同じ層の中を分けるので、計算の途中で相手の持ち分が必要になります。自分の断片だけでは、次の形を完成できません。

たとえば、大きな表を左右に分けたとします。左側を持つ機械は、左側の分だけを計算できます。右側を持つ機械は、右側の分だけを計算できます。けれど、層の出力として必要なのは、左右を合わせた結果です。

途中で、どちらかの結果を相手に渡します。足し合わせます。並べ直します。次の層へ渡せる形に戻します。

この受け渡しは、一歩の終わりだけではありません。層を進む途中で何度も起きます。前へ進む計算でも起きます。戻って直し方を求める計算でも起きます。

だから、この割り方は、機械どうしがごく近い場所にあるときに向きます。とても速い線でつながっている範囲なら、断片を細かく渡しても耐えられます。

逆に、遠い機械へ横に切って配ると、苦しくなります。計算より、話す時間ばかりが増えます。断片を作っては送り、受け取っては待つことになります。

横に切る割り方は、強いです。大きな層を抱えられるようになります。けれど、近い機械で固めないと、長所が消えます。

近いか、遠いか。

この物理的な差が、そのまま設計の差になります。

流れ作業には、隙間ができる

三つ目の、層を機械ごとに分ける流れ作業には、別の無駄があります。隙間です。

最初の機械が、一段目を計算します。終わると、結果を二台目へ渡します。二台目が二段目を計算します。さらに三台目へ渡します。

この形では、最初のひと束が後ろへ届くまで、後ろの機械は動けません。二台目は、一台目が終わるまで待ちます。三台目は、二台目が終わるまで待ちます。最後の機械は、かなり後になってから動きます。

立ち上がりでは、後ろが空きます。

終わりにも、同じことが起きます。最後のひと束が流れ終わるころ、前の機械はもう仕事を終えています。後ろだけが残ります。今度は前が空きます。

この空き時間が、隙間です。

隙間を薄めるには、データの束を細かく刻みます。大きな束を一つ流すのではなく、小さな束を次々に流します。

一つ目の小さな束が二台目へ渡ったら、一台目はすぐ二つ目の小さな束に入ります。二台目が一つ目を処理している間に、一台目は二つ目を処理します。三台目が一つ目を処理するころには、二台目は二つ目へ、一台目は三つ目へ進みます。

こうすると、作業台が埋まりやすくなります。隙間は薄くなります。

ただし、ゼロにはなりません。

最初に流し始める時間は残ります。最後に流し終える時間も残ります。束を細かくしすぎると、今度は渡す回数が増えます。細かく刻むほど、管理と受け渡しの費用も増えます。

流れ作業は、計算を層ごとに分けられる強い方法です。けれど、常に隙間との取引になります。

一台こけると、全部止まる

多くの機械で鍛えるとき、もう一つ避けられない問題があります。もろさです。

何千台もの機械が、同じ一歩を進んでいます。それぞれが計算し、方向を出し、揃えを待ちます。全台が同じ状態に戻ってから、次の一歩へ進みます。

この形では、どこか一台が止まると、全体が止まります。

残りの機械が正しく動いていても、一台が欠ければ、揃えが完成しません。その一台の方向が来ません。平均ができません。次の重みを全台で一致させられません。

第14回で見た、一体がこけると全体が崩れる話が、ここでは何千台の規模で起きます。

しかも、何千台で何週間も回すなら、一台の故障は珍しい事件ではありません。日常です。どこかの部品が止まります。線が不安定になります。計算の途中で一台が遅れます。記録を書けない台も出ます。

だから、途中の状態を外に書き出します。

重みだけでは足りません。今どこまで進んだかも要ります。重みを直すために使っている補助の値も要ります。データのどの位置まで見たかも要ります。乱れを入れる仕組みを使っているなら、その続き方も要ります。

これらを、訓練の途中でまとめて保存します。

こけたら、最初からやり直しません。最後に保存した場所まで戻ります。そこから再開します。

第46回で見た、外に状態を出して、足場まで戻る話です。あれが、鍛える現場にもあります。速くするためだけではありません。最後まで走り切るために、戻れる場所を作るのです。

割れる計算と、割れない通信

まとめます。

一つのモデルを多くの機械へ広げるとき、計算は割れます。同じモデルの写しを配れば、違うデータを同時に見られます。一つの層を横に切れば、大きな層を複数の機械で持てます。層ごとに分ければ、流れ作業にできます。

けれど、割ったものは揃えなければなりません。

同じ写しを持つなら、こう直せという方向を集め、平均し、全台に配り直します。横に切るなら、計算の途中で断片を何度も突き合わせます。流れ作業にするなら、前後の機械の間に隙間が生まれます。

計算は増やせます。けれど、通信は同じようには割れません。むしろ、台数が増えるほど重くなります。誰かを待つ時間も増えます。一台が止まれば、全体が止まります。

だから、分散訓練の設計は、計算をどう割るかだけでは決まりません。

通信をどう減らすか。近い機械の中で、どこまで横に切るか。流れ作業の隙間をどう薄めるか。こけても、どこまで戻ればよい形にしておくか。

勝負は、そこにあります。

手を増やすことより、増やした手をどう揃えるかのほうが難しいのです。

前に見た土台の非対称が、ここにもあります。計算は余り、運ぶことが詰まります。その形は、賢いモデルを生むいちばん手前の現場でも変わりません。

賢さが生まれる場所は、派手な計算の祭りではありません。地味な運びと、揃えとの戦いです。

補講は、まだ続く。

← 一覧へ