ふくしま

ソフトウェアエンジニア

立派なLLMを作るには国力が必要なんだなぁ

1週間以上前の話にはなるが、米中首脳会談が終わった後に日経新聞などを読んでいてびっくりしたと同時に納得したことがあるので記しておく。 大した考察などではなく、巷に溢れている内容になるだろう。だが、自分の言葉で残しておきたいと思ったのでブログに記す。

トランプ米大統領は2日間にわたる習近平国家主席との会談を終え、米中関係を「私は『G2』と呼ぶ」と宣言した。

引用: 社説:米中首脳会談 「G2」では世界の安定図れぬ : 読売新聞

上記の記事にあるように、G7は終わりG2になるらしい。

同床異夢の米中「安定」、火種の台湾武器売却 トランプ氏の切り札か - 日本経済新聞

僕は↑の日経の記事で知ったのだが、読んだ時に腰を抜かすかと思った。と同時に普通に納得した。 LLM系のAIで実務で使えるほど精度が高いものを作っているのは、アメリカと中国だけだという認識で、LLM作るのって国力がいるなぁと考えていたから。

アメリカだと、OpenAIのGPT, GoogleのGemini, AnthoropicのClaudeと世界中の皆が知っているし使っている。 中国だと、OSS系でQwenとかすぐに思い浮かぶ。DeepSeekの衝撃も記憶に新しい。 個人的な中国への印象としては、アメリカの後ろをまっすぐに追いかけているイメージで、アメリカが参考にしている論文も出している気がする。

僕はソフトウェアエンジニアとしてそれなりに毎日LLMのニュースを追っている。 しかし、アメリカと中国以外の企業がリリースしているモデルで使う気になるモデルはない。 (フランスのMistralとかカナダのCohereとか、名前はなんとなく知ってはいるが。。。) まあこれは僕が無知なだけかもしれない。

ともかく、実際に使える精度のLLMを作っているのは、アメリカと中国だけだという認識だということだ。

そんでそんな立派なLLMを作る(モデルを学習する)には、電力だったりGPUだったり研究者だったり、とにかくリソースがいる。 サービスとして提供する(推論する)のにもリソースがいる。

卵が先か鶏が先かわからない。 世界の覇権を握っていたアメリカと中国だったから、そのようなリソースを持っており立派なLLMを作れたのか。 立派なLLMを作ったからG2になったのか。 同時だったのかもしれない。 どちらにせよ、LLMの精度と国力は密接な関係にあるように思う。

つまり、もう明らかに向こう何十年か日本がGなんちゃらに加わることはないのだろう。というのが僕の見立てだ。 どの時間軸で見ても、日本にChatGPTを超えるLLMを作ることはできない。そもそもそんなリソースがないのだから。

SO-ARM101組み立てた話

2025年11月某日

僕は2つの段ボール箱を眺めて途方に暮れていた。 段ボール箱にはSeedStudioで買ったSO-ARM101のアームとモーター一式が入っている。

2025年5月1日に、SeedStudioでSO-ARM101を$255.00で買ってから半年以上が経っている。

ふとした時(確か会社からの帰宅の電車に乗っていた時だったと思う)に、「そういえば」と思って組み立て方をChatGPTに聞いてみたのを思い出す。 Windowsファームウェアのバージョンを上げる必要があるとのことだった。

無理だ。僕はWindowsを持っていない。もう組み立てられない。 SO-ARM101は文鎮として生涯を終えることになるかもしれない。

そう思っていた時に下記の「LeRobot(0.4.0アップデート)ハンズオン 第六回-SO-ARM 組立編&模倣学習」が開催されるとXで流れてきた。

robostadion.connpass.com

5,000円で文鎮がロボットアームになるなら安いものだ。

そもそも自力で組み立てようとしたら、Windows機を買う必要があるし経費としては10万円はくだらない。

とても安い。僕は即座に参加を決めた。


とまあ長々と書いたが、結果として僕はSO-ARM101を組み立てることができた。

ありがとう。ありがとう。一人では絶対に無理だった。

やっぱりチャッピーの言う通りファームウェアの更新が必要だったし、3Dプリンタにモーターをはめるのは固かったし、線はいっぱいあったし、モーターの順番が大事とか知らなかったし、etc、、、。いくつもはまりポイントがあった。

ともかく僕は組み立てられた。テレオペレーションもできた。

ありがとうロボスタディオン。ありがとう組み立てをサポートしてくださった方。ありがとう組み立て手順を書いてくださった方。

年末の休暇中に強化学習もしたい。

2025年の振り返りと抱負 ~データサイエンティストとソフトウェアエンジニアの間(あわい)~

概要

表題の通り、キャリアにおける2025年の振り返りをしたい。 データラーニングギルドのアドベントカレンダーに乗じてという形になるので、データサイエンスの観点もいれつつ。

公開の数時間前に急いで書いているので、多分後から色々と修正します。

本編

2025年の初めは「データサイエンティストとして頑張るぞ」と思っていた気がする。

2024年の振り返りと2025年の抱負 - ふくしま

Kaggleに参加して本もたくさん読んで。。。というような感じで。

正直、思惑とは違う形になった。

仕事でマネジメントごとが増えてきたからだ。 10月からは実際にマネージャーになって人を評価する立場になった。

お仕事もデータサイエンスど真ん中のプロジェクトというよりは、LLM関係のシステム構築が主になっている。 自分がソフトウェアエンジニアだった(今も心はソフトウェアエンジニア)ので、その知識が存分に生きる形になっている。 正直楽しい。

なので今年はデータサイエンスの勉強というよりは、ソフトウェアエンジニアリングの勉強が多かった気がする。

アルゴリズムとデータ構造はもちろん、外資系の面接で聞かれるようなシステム設計の勉強を多くした。 他にもマネージャーとは何か、エンジニアリングマネージャーとは何かみたいな本を読んだり考えることが多くなった。

このまま進めば、今の会社にソフトウェアエンジニアリングをうまく取り入れる仕事をやって、個人のキャリアとしては運用を含めたシステム作りのマネージメントが上手くなっていくんだろう。

ここで、それでいいのか?と自問自答してみる。

良いような気もする。 しかし、2026年はもう少し先に踏み込みたいと思っている。

2026年中にソフトウェアエンジニアリングの部分は、今の会社でもある程度整える。 さらに、LLM系のナニガシをシステムに載せる特有の問題にも向き合っていきたい。

多分、MLOpsだったりLLMOpsだったりの勉強がいるんだろう。

仮説を持って仕事にあたり定量的にフィードバックを得て改善したい。そしてまた仮説を持って。。。続く。

以上。

データラーニングギルドとは?

データラーニングギルド は、株式会社データラーニングが運営する、
データサイエンスを中心とした学習者・現役データサイエンティスト・エンジニアのためのコミュニティです。

学びの共有・キャリア形成・横のつながりを大切にし、
勉強会、LT会、技術相談、キャリア支援、案件紹介など、
「データ領域で挑戦したい人を応援する活動」を幅広く行っています。

初心者から実務者まで、誰もが成長できる場づくりを目指しています。

🔗公式サイト:https://data-learning.com/guild

青空文庫でLLMの事前学習をしてみた話

概要

表題の通り、青空文庫データを使って超小規模なGPT(0.1Bくらい)を事前学習してみた。のでその記録である。

Sebastian Raschka 氏の「Build a Large Language Model From Scratch」を土台にして、日本語データ前処理、Hugging Face トークナイザ対応、RunPod での学習、推論ユーティリティを作成してみた。

ほとんどのコードが引用であるし、その他コードもCursorが書いたので、僕は適当に学習回しただけではあるが。一応の記録。

参考書籍/引用コード

感想

  • それっぽく日本語を吐き出すLLMを作れたので結構満足
  • GPT-2相当のアーキテクチャのコードを書籍を読みながら動かしたので、理解できた気がして満足
  • GPUはRunPodを使用して$10もかからなかったので料金面も満足
  • lossが下がりきらなかったのが残念ポイント。理由もよくわかってない。

学習したLLMで推論してみた結果

以下を吐き出すLLMができた。中身はメチャクチャだが表面上は日本語っぽいものを吐き出している。

$ python inference.py \
  --exp_dir exp001 \
  --prompt "吾輩は猫である。名前は" \
  --max_new_tokens 200 \
  --temperature 0.8 \
  --top_k 40

吾輩は猫である。名前は勿論だが、おのずから大概の猫であるから、おしやべることはしません。 私が、もし、もし、もし、一年で二度しかお嫁がないとしたならば、私が、その猫のやうに、お嫁を貰つたならば、それは私とちがつて何ともいへない幸福である。(私は、私の家の財産も、おしやべりも、決して他の家へ送ればおしやべりもせず、また、このまゝ帰つて来ては、私の家へも、主人が、お嫁に行つたら、その恩返しをしたいといふ事もあつたかも知れない。) 今年は、今年も、また二年はたしかに、三年では、もう十年もたつた今年も、私はその恩返しをし、恩返しをしても、おしやべりをし、それと、

と言いつつ上記はいい感じの出力を選んでいる。調子が悪い時は以下のような出力も出てくるw

吾輩は猫である。名前は、どうであるか。 君の句に、『私は、決して、狐ではない。狐である。狐である。狐は、狐である。狐は、狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐は、狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐には、狐である。狐は、狐である。狐である。狐である。狐は、狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐は狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。狐である。鬼である

軽く解説

詳しくはリポジトリのREADMEとコードを見ていただけると良いかと。

scratch-club/llm-japanese at main · Jonh-Nash/scratch-club · GitHub

データセット

データセット青空文庫を整形しているものがあったので使わせていただいた。ありがたし。

トークナイザ

  • トークナイザは Hugging Face の日本語 GPT-2 系を利用(rinna/japanese-gpt2-small

RunPodでの学習

  • RunPodでRTX A5000 を使った。$0.27/h なのでとてもお得。
  • nohupで学習コマンドを実行すると、SSH接続が落ちてもRunPod側でプロセスが動き続けるので良い

学習ログを見てみよう

scratch-club/llm-japanese/exp001/training.log at main · Jonh-Nash/scratch-club · GitHub

  • exp001(1 epoch)の例では、初期の学習・検証損失は ~9 台から始まり、終盤で ~3.6–3.8 台まで低下
  • 総学習時間は約 2 時間 40 分
  • 最大GPUメモリ約 17.4GB
  • lossが3中盤から落ちなかった。

いかにうまく失敗をするか

最近、仕事でマネージャー業をさせてもらってて、考えていることがある。 それは「早めに小さく失敗をして学ぶ」というのを組織単位で行うにはどうしたら良いかということだ。

人は自分のアウトプットに対する正しいフィードバックを得て初めて学べる。と思う。 自分はそうだと経験的に理解しているし、そうするように気をつけている。 何かを新しく学ぶときは素早くアウトプットして間違えて専門家に指摘してもらうようにしている。

例えば、自分はここ最近ジムに通い始めてトレーニングを始めたのだが、同時に家での自重トレーニングも開始した。 家トレーニングでは、腕立てや懸垂、ディップスなどをやってみているが、正しいフォームでできているかさっぱり分からない。 そういう時に契約しているトレーナーに聞いてフィードバックをもらう。

例えば腕立てについてフォームを見てもらう(アウトプット)。 自分で動画を撮ったりYoutubeを見たりしていただけでは気づかなかった「首が前に出ていてお腹が下がっている」というのを指摘された(フィードバック)。 確かに言われたとおりにしてみると、なるほどかなり胸筋に効くようになった。 その他のメニューもフィードバックをもらって家トレーニングの質が格段に向上した。

というように、アウトプットを仕掛かりで素早く出して、専門家にフィードバックをもらうというのは、自己流でやるより成長の速度が格段に違う。と思う。

あと、フィードバックで言うと、成功した時より失敗した時のフィードバックの方が質が良いような気がする。 野村克也氏が「勝ちに不思議の勝ちあり、負けに不思議の負けなし」と言っているように、失敗は成功より因果が見えやすい。気がする。

さて、仕事をしていると、この「序盤で素早く失敗してフィードバックを得る」を組織にも当てはめたくなってくる。

どうしたらいいんだろう?正直自分の中で答えは出ておらず、以下らの仮説がある。

  • 可逆なものは情報が不完全でも素早く意思決定する(不可逆なものはどうすれば良いのか分からない)
  • 失敗できる環境、サンドボックスを整える
  • そもそもやらないことを決める。やるべきことに集中する

なんか書いてたら「イシューからはじめよ」に全部書いてある気がしてきた。もう一度読もう。

そんだけ。以上。

「作って学ぶOSの仕組み」をMacbook m1でやってみる

概要

表題の通り「作って学ぶOSの仕組み」をMacbook Pro M1 でやってみる。何か別途 Macbook 用の対応が必要であればここに書いていく。

[作って学ぶ]OSのしくみⅠ | 技術評論社

現在地

第2章の「QEMU を利用して UEFI アプリケーションを実行する」で Hello, world! が出た!

各種インストール

今の所、以下のみ。

QEMU

Download QEMU - QEMU

  • brew install qemu
  • qemu-system-x86_64 --version
    • QEMU emulator version 10.0.3

Rust

Install Rust - Rust Programming Language

  • curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • cargo --version
    • cargo 1.89.0 (c24e10642 2025-06-23)
  • rustc --version
    • rustc 1.89.0 (29483883e 2025-08-04)

その他

最初から入っていた。

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

$ clang --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ nc
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
          [--apple-recv-anyif] [--apple-awdl-unres]
          [--apple-boundif ifbound]
          [--apple-no-cellular] [--apple-no-expensive]
          [--apple-no-flowadv] [--apple-tcp-timeout conntimo]
          [--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
          [--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
          [--tcp-adp-rtimo num_probes] [--apple-intcoproc-allow]
          [--apple-tcp-adp-wtimo num_probes]
          [--setsockopt-later] [--apple-no-connectx]
          [--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
          [--apple-kao] [--apple-ext-bk-idle]
          [--apple-netsvctype svc] [---apple-nowakefromsleep]
          [--apple-notify-ack] [--apple-sockev]
          [--apple-tos tos] [--apple-tos-cmsg]
          [-s source_ip_address] [-w timeout] [-X proxy_version]
          [-x proxy_address[:port]] [hostname] [port[s]]

各章の対応

第2章

「Rustツールチェインのバージョンを固定する」で以下のように設定

[toolchain]
channel = "nightly-2024-01-01"
components = ["rustfmt", "rust-src"]
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
targets = ["x86_64-apple-darwin"]
profile = "default"

QEMU を使用して UEFI アプリケーションを実行する」は、以下のように本の通りにやったらできた

  • cargo build --target x86_64-unknown-uefi
  • qemu-system-x86_64 -bios third_party/ovmf/RELEASEX64_OVMF.fd -drive format=raw,file=fat:rw:mnt

Railway.appに設定した環境変数が取得できなかった話

概要

表題の通り

現象

Railway.appに設定した環境変数が、FastAPI上でどうやっても取得できなかった。

解決策

なんということはない。以下の通り環境変数を設定した後、コンテナをrebuildしていなかっただけだった。コンテナに読み込まれていないだけだった。

Environment variables not available in runtime - Railway Help Station