Crystal の ONNX Runtime のバインディングをAIに作ってもらった話

||||
|--|--|--|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/ee265302-7ee5-437e-aa99-13849bcc0f8a.png)|![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f00d2b89-19f9-4aaf-b1c4-5e686ec2dd67.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/d34d055d-3101-43db-b958-ac636963f7ce.png)|

## はじめに

[Crystal](https://crystal-lang.org/) とは、Ruby によく似た静的型付き言語です。とても高速です。  
[ONNX Runtime](https://onnxruntime.ai/) は、Deep Learning などで使われる推論エンジンです。

Deep Learning の黎明期には、Chainer などの Python ライブラリで画像を分類するのが流行しましたが、結局のところ、モデルの自作は一般人にはなかなか手が届かず、やりたいことは「手元の PC 上での高速な推論」なんですよね。その点、ONNX Runtime は CPU でも高速に推論を実行してくれます。

Ankane さんが [Ruby のバインディング](https://github.com/ankane/onnxruntime-ruby) を作ってくれていたりして、Crystal でも使いたいなと思っていました。

しかし、ONNX Runtime の C API はかなり難しい。  
Microsoft 社が互換性を重視している API で、バージョン番号に応じて構造体内に関数が格納される仕組みのため、[LLVM による解析](https://github.com/crystal-lang/crystal_lib) で自動的に低レベルのバインディングを作成するのが難しい状況でした。

たとえ低レベルのバインディングの作成に成功したとしても、高レベルのバインディングの実装も困難だと分かっていました。時間も知識も足りないし、Crystal には二次元行列を扱うためのライブラリすらないのですから。

そのため、2022年頃に作り始めてはいたものの、バージョン番号を表示するくらいで力尽きてしまい、あきらめていました。

## Cline と Claude に重課金したら作ってくれた

しかし、今は AI エージェントの時代です。  
AI エージェントがどのくらいバインディングを作れるのか試してみたくて、Claude 3.7 Sonnet に課金しまくって、ONNX Runtime の Crystal バインディングを書いてもらいました。すると、なんと1日で動くものができてしまいました。（全部で50ドルくらいかかったと思います）

https://github.com/kojix2/onnxruntime.cr

プロジェクトに C++ のピンク色が目立つのは、AI が参照できるように C のヘッダファイルを含めているからです。

以前なら Ankane さんのようなバインディング職人が、何週間もかけて作成していたようなライブラリが、AI によって一瞬で作られる時代になってしまいました。

Kemal を使って、MNIST 手書き文字を認識するウェブアプリも作ってもらいました。それもあっという間に完成しました。
![Gnp-T4BaMAYQFw1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a8223533-eb10-4e41-9f79-3ab4664d69b8.jpeg)

## 楽しい、けど未来はどうなる？

Crystal 言語で Deep Learning ができるようになって、とてもうれしいです！

もしこれが手書きのバインディングだったら、「やったー」で話は終わっていたと思います。そして、おそらく YOLO などのモデルを動かす方向に力を注いでいたでしょう。

でも、これは AI による自動生成のバインディングです。  
正直言って、このライブラリの中身を私はほとんど理解していません。やったことといえば、課金を続けながら、AI に「続きを書いて」と指示を送り続けただけです。

それでも Claude-Sonnet-3.7 は、見事にライブラリを生成してくれました。

これまでAIはCrystalのコードの生成を苦手としていました。RubyのコードとCrystalのコードには細かい差異があり、Rubyの影響でCrystalとしては動かないコードを書いてしまうことが多かったのです。けれどもそんな学習材料も多くないマイナー言語のCrystalにSonnetは見事に順応しています。

マイナー言語のCrystalをこれほど高い完成度で扱えるのですから、実際には、ほとんどのプログラミング言語に対して、その場でバインディングやライブラリを生成できる時代が到来したということを意味していると思います。

もちろん、職業エンジニアが作成するような「納品レベル」のコードにはまだ及ばないかもしれません。

AI で作ったツールにはバグがつきもので、この `onnxruntime.cr` も、macOS ではプログラム終了時にエラーが出るので、メモリ解放にミスがある可能性が高いです。

でも、そういう課題は時間とともに解決されていくでしょう。また今後は AI を用いた既存のソフトウェアのメンテナンスをどうするか？という議論も出てくることでしょう。

## 既存言語のエコシステム資産はどうなるか？

これが Python など既存の言語が築いてきたエコシステムや成果物を「無力化」する方向に進むのか、あるいは逆に、エコシステム成果物＝かけてきた電気代（エネルギー）という奇妙な形で、ますます強化されるのかは、正直まだ分かりません。

想像力を働かせて、個人的な予想を書いてみます：

1. マイナーな言語でも AI を使って既存のライブラリを即席生成できるようになり、「エコシステムに勝てる！」と盛り上がる  
2. しかし、大資本が既存言語に莫大な電気代を投入してライブラリを最適化・量産し、個人が課金して作るマイナー言語なんて相手にされない世界になる  
3. ただし、既存言語にも欠点があるため、AI に最適な文法を割り出させて、理想的な処理系を作成し、そこに大規模投資してライブラリを生成する流れが流行る
4. しかし、いくらライブラリが生成できても、それを動かす計算資源がなければ意味がない
5. 結局はハードウェア（CPUやGPU）依存になるので、半導体や新型コンピュータの開発への期待が高まる

といった感じになるのではと思っています。…あまり当たっていないかもしれませんけどね。

みなさんはどう思いますか？

この記事は以上です。

---

本記事は、ChatGPTによる日本語の編集・校正を行っていますが、本文の内容は人間である私が全て書きました。