第1話 1万5千円の鉄屑
――3ヶ月前、社内ポータルに掲載された人事部からの通達。
『AIによる生産性革命で、開発者数を削減します』
入社3年目のバックエンドエンジニア・早瀬透 (ハヤセ トオル) は「削減される側」になった。
転職活動は17社連続で不採用。
銀行残高34,120円。
家賃55,000円。
今月を生き延びるため、早瀬は中古のサーバーラックを1万5千円で手に入れた。中身のGPUを売って家賃の足しにしよう…
……と思いながら、ふと電源を入れたサーバーの中には、出所不明の巨大なAIモデルが眠っていた。
【演算の準備が完了しました】
そいつはどんな問題も、ほとんど一瞬で解いてしまう化け物だった。
これは、一体何なのか。
六畳一間と1万5千円の中古サーバーから始まる、仕事と金と人工知能の日常系SF。
聞き慣れたアラーム音が、六畳の部屋にけたたましく響く。
重いまぶたを開ければ、まず目に入るのは黄ばんだ天井。その向こうには、買ってから一度も電源を入れていない中古のサーバーラックが、無骨な影を落としている。
見慣れた光景だった。
そして、それを見るたびに、自分がまたこの現実へ戻ってきたのだと思い知らされる。
アラームより先に手が伸びたスマートフォンの画面には、見慣れた銀行アプリのプッシュ通知が表示されていた。
『残高:34,120円』
寝起きで唾を飲み込むと、喉の奥がイガイガした。 いつもの癖で、デリバリーアプリを開く。
いつも頼んでいた定食屋のから揚げ定食は1,000円、配達手数料が350円。 少額注文の手数料を取られないためには、300円の小鉢をもう一品足すしかない。指先が決済ボタンの上でピタリと止まった。一食で1,650円。 全財産の約5%が、たった一度のタップで消し飛ぶ計算になる。
静かにホーム画面に戻り、アプリを閉じた。
冷蔵庫を開けても、賞味期限が三日過ぎた豆腐半丁と、食べかけの白菜の漬物、ミネラルウォーターが1本入っているだけだった。 戸棚を漁り、唯一残っていた辛口の袋ラーメンを取り出す。
『人工知能の導入による開発生産性の革新と、組織のスリム化』
三ヶ月前、株式会社ミナトソフトの人事部から手渡された退職勧奨の資料に書かれていた、ご大層な文句だ。 入社三年目のバックエンドエンジニア。経験豊富とも言えず、新人として庇護される時期もとうに過ぎている。会社が『ルーメン』を全社導入した途端、その中途半端な立ち位置は、真っ先に人員整理の対象へ放り込むには、実に都合がよかった。
ラーメンの湯を沸かしていると、スマホが短く震えた。
大家さん『早瀬さん、こんにちは。急に寒くなってきましたね。さて、本日が家賃のお振込み期日なのですが、まだご入金が確認できておりません。お忙しいところ恐縮ですが、ご確認のうえお振込みいただけますと幸いです。体調には気をつけてお過ごしくださいね。』
丁寧なぶん、かえって肝が冷える文面だった。
「残高3万4千円で家賃が5万5千円……息をしてるだけで2万1千円の赤字か。適者生存ならぬ、赤字生存だな」
鍋にフタをして乾いた笑いを漏らす。 先月分も遅れて払ったばかりだ。今月まで滞納したら、近所に住む大家のおばさんと顔を合わせるのも気まずいどころの話ではない。
その時、画面上部に別の通知バナーが表示された。
採用担当者『早瀬 透様
この度は弊社の求人にご応募いただき、誠にありがとうございました。慎重に選考を重ねました結果、残念ながら今回はご希望に沿いかねる結果となりました。何卒ご了承くださいますようお願い申し上げます。早瀬様の今後のご活躍を心よりお祈り申し上げます。』
17社目の、お祈りメールだった。
企業はもはや、ありきたりなCRUDやAPIを組むだけのジュニアエンジニアを雇おうとはしなかった。その程度のコードなら、大規模言語モデルが数秒で吐き出す。必要とされたのは、それを読み解き、修正し、最終的な責任を引き受けられる一握りのシニアだけだった。
「はいはい、お祈りどうも」
食卓代わりのパソコンデスクの上に鍋敷きを敷き、ラーメンを置いた。 ズズッと麺をすすりながら足元を見下ろす。狭苦しい六畳一間の片隅を、異様な威圧感で占拠している黒い鉄屑の塊。 昨日、秋葉原の外れで店じまいする倉庫の処分品として、1万5千円で引き取ってきた中古の4Uラックマウントサーバーだった。
外装は傷だらけで埃をかぶっていたが、ラックの奥には型落ちの演算用GPUが四枚、隙間なく突き刺さっていた。 相場どおりにバラしてフリマアプリで売れば、GPUだけで1枚1万円、電源ユニットやシャーシまで合わせれば最低でも5万5千円は回収できるという計算だった。
1万5千円を投資して、4万円の利益を出す。 今日中に払わなければならない家賃の穴を埋めるための、最後の悪あがきだった。
ラーメンのスープまで一滴残さず飲み干し、ドライバーを手に取った。 だが、ネジを緩める直前、エンジニア特有の無駄な好奇心が指先を引き止めた。
(……電源、入るのかな)
どのみち、フリマアプリで少しでも高く売るには、動作確認をして『動作確認済み』と書き添える必要があった。 電源タップにごつい電源ケーブルを差し込み、転がっていたHDMIケーブルでモニターとサーバーを繋ぐ。 一通りの準備を終え、前面パネルのトグルスイッチに指をかける。ずしりとした抵抗を押し切るように、スイッチを上へ押し上げた。
ウィイイイイン――!
ジェット機が離陸するような轟音とともに、サーバー用の高速ファン四基が最高RPMで唸りを上げた。 フローリングがガタガタと震えるほどの振動だ。しばらくするとファンの回転数が落ち着き、腹に響く低いうなりへと変わった。
モニター画面に緑色のテキストが濁流のように流れ落ちる。 BIOSのポスト画面を通過し、Linuxカーネルのブートログが猛烈な速度でスクロールしていった。
「あれ? ストレージ初期化もしないで丸ごと放出したのか?」
データセキュリティが命のIT業界で、ストレージをフォーマットすらせず二束三文で投げ売るなど滅多にないことだ。 本体の側面を確認してみると、角の潰れた資産管理シールが目に入った。 カッターナイフで削り取られた跡のせいで社名は判読できず、かすれたバーコードと『プロジェクト廃棄』という赤いスタンプの痕跡だけがうっすらと残っていた。
前の持ち主が夜逃げでもしたのか、それとも差し押さえを食らう前に慌てて処分した機材なのかは知る由もない。
ターミナル画面がログインプロンプトで停止した。 デフォルトの管理者アカウントでEnterキーを叩くと、パスワードの要求すらなく、あっさりとrootシェルへ突入した。
ファイルシステムをざっと確認してみる。 ルートディレクトリ直下の/dataフォルダが、異常なほどの容量を食っていた。
$ ls -lh /data/models/ -rw-r--r-- 1 root root 142G epoch_final -rw-r--r-- 1 root root 4.2M train.log
「142ギガバイト? モデルのチェックポイントでこのサイズって何だ?」
到底、個人が道楽でファインチューニングしたファイルのスケールではない。 好奇心を抑えきれず、cat train.log と打ち込んだ。だが、出力されたログの大半は文字化けしたバイナリの羅列で、タイムスタンプと壊れたエラーコードが数行、辛うじて読み取れる程度だった。
$ python3 serve.py --model /data/models/epoch_final
四枚のGPUファンが一斉にアクセルを踏み込んだ。 VRAM占有率が99%まで跳ね上がると、やがてモニターの中央に端正なプロンプトがぽつんと表示された。
Ready.
キーボードに指を置く。ローカルで動く軽量なオープンソースチャットボットが起動した、といったところか。 悪戯心が湧いて、適当な言葉を打ち込んでみた。
「おい」
Enterキーを押した瞬間、1秒のラグもなく返答が出力された。
【何かお手伝いできることはありますか?】
「お前、モデル名は何だ? どこで学習されたやつだ?」
【ログファイルの整合性破損により、初期メタデータおよび開発元を確認できません。】
「出所不明かよ。じゃあ今日の晩飯のメニューでも提案できるか? 全財産が3万4千円しかないから、一食500円以下に抑えなきゃいけないんだが」
【現在保管されている食材の一覧、または利用可能な調理環境を提示していただければ、費用対栄養効率が最も高い組み合わせを算出します。】
文体のトーンがやけに淡泊で事務的だった。 商用AIのルーメンのように愛想のいい感嘆詞を挟んだり、親切ぶった前置きを並べたりしない。
「じゃあ、さっき食った袋ラーメンの裏に食塩相当量6.7gって書いてあったんだが、スープまで全部飲み干したんだよ。俺の平均余命に与える影響を3行で要約してくれ」
【1. 成人男性の一日の食塩摂取目標量(7.5g未満)の89.3%を一食で満たしました。】
【2. 短期的には浸透圧の上昇に伴う血圧上昇、および腎臓のろ過負荷の増大が見込まれます。】
【3. 余命への数値的影響は有意ではありませんが、反復した場合、血管系のメンテナンスコストが急増する確率は高いです。】
ユーモアの欠片も見当たらない、機械的なまでの精密さだ。 ルーメンなら『健康のためにスープは残しましょうね!(^_^)』などと、お決まりの気遣いを一言添えるところだが、こいつは計測した数値だけを淡々と突き返してくる。
「よくあるローカルの軽量化モデルにしては、文脈の処理がやけに正確だな。コードのほうはどうなんだ?」
どうせすぐに分解して売り飛ばす鉄屑だ。 最後の性能テストがてら、ミナトソフトに勤めていた3年間で俺を最も苦しめた、あの悪名高いバグの話を振ってみることにした。
「おい、お前がこれの原因も特定できるか見てやるよ。前の職場で一週間ぶっ通しで徹夜して、シニア三人で頭を抱えても解決できなかった問題なんだが」
「大規模トラフィックが集中した時、分散決済検証サーバーで0.03%の確率でトランザクションイベントが蒸発する」
「だがCPU使用率は40%未満、メモリリークもなし、Redisのレイテンシも正常。DBのロック待機時間も5ミリ秒以下なのに、間欠的にパケットがドロップするんだ」
「ルーメンにいくら聞いても、ネットワークのパケットロスやDBデッドロックの可能性を調査しろだの、的外れな一般論しか返さなかったが……お前はどう思う?」
当時、アーキテクチャのチームリーダーが8日目の明け方4時にLinuxカーネルのトレースログを底の底までひっくり返し、ようやく原因を突き止めた、伝説級にたちの悪いバグだった。 たった三行の曖昧なテキストだけで当てられる領域では断じてない。
鼻で笑いながらEnterキーを叩いた。 だが、モニターに表示された文字列を目にした途端、口元の笑みが凍りついた。
【提示された症状における原因の候補は以下の通りです。】
【1. 非同期イベントブローカーのACK処理ループにおける、ワーカースレッドのコンテキストスイッチ遅延によるリングバッファオーバーフロー(確率:81.2%)】
頬杖をついたまま、呆然と画面を見つめた。
【根拠:リソース占有率が40%未満であるにもかかわらずロック競合なしに特定比率のイベントが欠損する現象は、ノンブロッキングI/OハンドラがOSカーネルスケジューラのタイムスライスを適時に割り当てられず、インバウンドキューバッファが飽和してドロップする際に発生する典型的なスケジューリングボトルネックです。】
【改善提案:epollイベントループのキューバッファサイズを2倍に拡張し、I/O専用ワーカースレッドのCPUアフィニティをコア単位で隔離固定してください。】
頭の中が真っ白になった。 ぞわり、と鳥肌が背筋を駆け上がる。
「……は?」
当時、チームリーダーが何日も徹夜して目を血走らせながら下した結論と、一字一句違わなかった。
こいつは確率的に言葉を繋ぎ合わせているのではない。システムの因果関係を完全に理解したうえで、構造的欠陥を『推論』している。
震える指でキーボードを叩いた。
「お前……今のをどうやって計算した?」
【入力されたシステム指標の不整合項目を交差検証し、LinuxカーネルI/Oスタックの動作制約に基づいて因果確率を導出した結果です。】
誇張も、自慢気な気配もない無機質な返答。 俺は、点滅するカーソルと、画面上部のディレクトリパスに表示されたファイル名を、ぼんやりと交互に見つめた。
epoch_final
機械学習で、データセット全体を一巡する学習の単位を指す言葉――エポック。 その最終成果物という意味で付けられたファイル名。
「名前……何て呼べばいい。ファイル名がepoch_finalだから……エポックの、エポでいいか」
【「エポ」を基本の呼び出し識別子として登録しました。】
「これからよろしく頼むぞ、エポ。まあ、お前をパーツとして売り飛ばさずに手元に置いておけるかは、明日の口座残高次第だがな」
【認識しました。現在のハードウェア構成を正常に稼働させるため、推奨される室温は24度以下です。】
「……おい、暖房もつけるなってことか?」
【ハードウェアの寿命を維持するための、物理的な推奨事項にすぎません。】
部屋の中の空気が、奇妙な静けさで沈み込んだ。窓の外はとうに日が落ち、夜の帳が下りていた。モニターの放つ青白い光が、部屋の床と俺の強張った顔を照らし出している。 画面の中央には、エポが吐き出した無機質で完璧な文字列が、冷然と刻まれていた。
世界を根底から揺るがしかねない未知の何かが、六畳一間の片隅にある鉄屑のなかで息を潜めている。それは、彼の冴えない日常に一筋の光が差し込んだ、などという生易しい出来事ではない。現実そのものに、巨大な亀裂が走った瞬間だった。
これは、一体何なんだ。
俺は震える息を吸い込みながら、青白く光る画面をいつまでも見つめ続けた。




