洋食の日記

記事をです・ます調で書き始めれば良かったと後悔している人のブログです

native extensionを別なディレクトリに配置するディストリビューションがあるのでrequire_relativeするとLoadErrorになる

Rocky LinuxでdnfでインストールしたRubyで、 gem install native_extesionsなgem すると、native extensionsを/usr/local/lib64/gems以下に、通常のRubyスクリプトを/usr/local/share/gems以下に分けて配置される。そのため、Rubyスクリプトからnative exte…

Numo::NArrayをforkしました

Numo::NArrayは、PythonでいうところのNumpyで、Rubyで機械学習・データ分析するのに基盤となるgemである。Numo::NArrayは、2022年8月20日にリリースされた0.9.2.1以降、新しいリリースがない(2025年10月9日現在)。リポジトリを見ると全く開発が停止してい…

llama_cpp.rbのネイティブ拡張のコードをC言語に書き換えた

タイトルのとおり、llama.cppのRubyバインディングであるllama_cpp.rbのネイティブ拡張のコードを、C++からC言語に書き換えて、v0.18.0としてリリースした。 rubygems.org llama.cppは、本体はC++で書かれているが、llama.hは、C言語でも呼び出せる形で書か…

Rumaleのバージョン1.0.0をリリースした

はじめに RumaleにVariable-Random Trees(VR Trees)を実装して、バージョン1.0.0としてリリースした。本来であれば、0.30.0相当の変更なのだが、マイナーバージョンをひたすら大きくしていくのもアレだし、Rumaleも前身のSVMKitを含めると5年以上開発して…

2024年は忙しかったんでしょうね

2024年は忙しかったみたいで、転職エントリーしか書いてませんでした。人生において、年収の減る転職が多いのですが、今回も約100万円くらい減りました。くわえて、前職は、会社の1年が10月始まりで、9月末で辞めたのでキレイに1年働いた形なのですが、ボー…

弥生株式会社を退職しました

2024年9月30日をもって、弥生株式会社(株式会社Misoca)を退職しました。株式会社Misocaに入社したつもりが、途中、弥生株式会社に吸収合併されて、株式会社Misocaはなくなってしまいました。約7年間の勤務を振り返ってみると、1年以上も手や指の腱鞘炎に悩…

2023年はいつのまにか健康になった年だった

ここ数年、腱鞘炎とか帯状疱疹とか腫瘍切ったりとか色々あったけど、2023年はそういう謎の体調不良に襲われることが無かった。 あるとしたら、吐き気がして起きてられないくらいの激しい頭痛に襲われたぐらい。それも、後日、脳神経内科でCTとか丁寧に検査し…

RumaleにHessian Eigenmapsによる次元削減を追加した

はじめに 最近、Rumaleのリリース記事を書くことをすっかり忘れていた。最近リリースしたv0.28.1では、多様体学習の非線形次元削減手法であるHessian Eigenmaps(a.k.a. Hessian Locally Linear Embedding, HLLE)を実装した。HLLEは、各点の十分に小さい近…

Rumale::SVMにClustered SVMによる分類器を追加した

はじめに Clustered Support Vector Machine(CSVM)は、データをクラスタリングし、各クラスターごとに線形SVMを学習することで、非線形な分類器を実現する手法である。また、Rumale::SVMは、Rubyの機械学習ライブラリであるRumaleと同様のインターフェース…

Rumale::SVMにRandom Recursive SVMによる分類器を追加した

はじめに Random Recursive Support Vector Machine(R2SVM)は、ランダム射影による特徴変換を繰り返すことで、線形SVMで非線形な分類器を実現する手法である。また、Rumale::SVMは、Rubyの機械学習ライブラリであるRumaleと同様のインターフェースで、様々…

Rumale::SVMにLocally Linear SVMによる分類器を追加した

はじめに Locally Linear Support Vector Machine(LL-SVM)は、多様体学習の考え方を利用して、線形SVMで非線形分類器を実現する手法である。Rumale::SVMは、Rubyの機械学習ライブラリであるRumaleと同様のインターフェースで、LIBLINEARやLIBSVMで実装され…

LINE社の日本語言語モデルは前提知識をもとにした回答ができる

はじめに Hugging FaceにあるLINE社の日本語言語モデルの実行例では、四国の県名をたずねるシンプルな受け答えのみなので、凝ったことができるか試してみた。結果、前提知識をもとに回答できることがわかった。 実験 準備 LINE社の日本語言語モデルを、GPTNe…

LINE社の日本語言語モデルをRubyで試す

はじめに LINE社の日本語言語モデルを手元のmacOSで試したくて、llama.cppのRuby bindingsを作ってる経験を活かして簡単なGPT-NeoXモデルのクライアントを作った。 github.com モデルの準備 LINE社の言語モデルをggml形式に変換する。ggmlをcloneしてきて、…

Numo::LinalgのサブセットのNumo::TinyLinalgを作った

はじめに Numo::NArrayで逆行列計算や固有値分解などの線形代数計算を担うNumo::LinalgのサブセットであるNumo::TinyLinalgを少しずつ作っていた。どのようなサブセットかというと、機械学習で使う(Rumaleで使う)メソッドだけを実装したものになる。 githu…

llama_cpp.rbを使ってRubyでLlama2を利用する

概要 llama.cppのRuby bindingsであるllama_cpp.rbでもLlama2が使えた。 github.com インストール llama_cpp.rbのインストールは、通常のnative extensionsなgemと同様である。 $ gem install llama_cpp もしmacOSを利用しているなら、metalオプションをつけ…

3ヶ月間大規模言語モデル関連の開発に力をいれてみた

花粉症なので、洗濯後に外干しはせずに、コインランドリーで乾燥機にかけている。乾燥機が止まるまで暇なのでKindleで本を読んでいる。その中で、「3か月」の使い方で人生は変わる、を読んだ。著者はGoogleに務めた経験があり、Googleでは3ヶ月周期でプロジ…

llama_cpp.rbでチャットボットのサンプルを作った

はじめに 以前に作ったllama.cppのRuby bindingsであるllama_cpp.rbでチャットボットのサンプルを作った。llama.cppのexamples/main/main.cppをいい感じにRubyにすれば作れるので「誰か作ってくれないかな」という他人まかせな気持ちでいたが、作る時間がと…

不健康初心者なので体調が悪いことの検知と対処ができない

これは自分への備忘録である。 3年前からヒドい腱鞘炎に悩まされるようになるまで、高い健康運を頼りに生きて来てので、体調が悪いことに気づけない。そもそも腱鞘炎が悪化したのも、手に違和感があることを「そのうち治るだろう」で放置したのが良くなかっ…

llama.cppのRuby bindingsを作った

はじめに llama.cppはMetaの大規模言語モデル (Large Language Models, LLMs) であるLLaMAを、量子化することでCPU上で動作させるものである。C/C++で実装されているので、Ruby bindingsを作って、Rubyから呼び出せるようにした。 github.com 使い方 インス…

ChatGPTのパーソナリティ特性を調べてみた

はじめに ChatGPTが人間のように回答するので、パーソナリティ特性はどうなるか興味がわいた。パーソナリティ特性の尺度として広く用いられるものにBig Fiveというものがあり、これを調べてみた。Plusにしてない無課金ユーザーなので、回答が短くなるように…

近似最近傍探索ライブラリHnswlibのNode.js bindingを作っていた

はじめに Hnswlibは、近似最近棒探索のベンチマークでも上位に位置する、Hierarchical Navigable Small World graphsによるC++の近似最近傍探索ライブラリである。Node.jsのbindingがなかったので、腱鞘炎のリハビリとnpm作成の勉強がてら作成していた。ずっ…

SentencePieceのRuby bindingsを作った

はじめに Rubyでなにか大規模言語モデル (Large Language Models, LLMs) に関することをやってみようと思って、SentencePieceのbinding gemがないことに気づいて作った。 github.com SentencePieceはニューラルネットワークな言語処理向けに作られたTokenize…

確率分布に従う乱数によるNumo::NArrayを生成するNumo::Randomを作った

はじめに 正規分布や二項分布などの確率分布に従う(疑似)乱数によるNumo::NArrayを生成するNumo::Randomを作った。アイディア自体はずっと前に考えていたが、腱鞘炎と忙しさで、形にできていなかった。 github.com 動機 Numo::NArray自体にも、一様乱数を…

帯状庖疹は痛いし長引く

帯状庖疹になった。これを書いてる時点で、発症から2週間ちょっとだが、ブツブツはあるし痒みと寝起きとかに若干の痛みがある。背中と腰にブツブツができた当初は「あせもができたかな?」と思ったが、すぐにロキソニンを飲まないと眠れないほどの痛みが起き…

ひどい腱鞘炎になると一年たってもなおらない

4月になった。手に痛みを感じて湿布貼ったりし始めたのが去年の4月頃なので、腱鞘炎になってだいたい1年がたった。個人的には、痛みを和らげる塗り薬よりも、サポーターでガチガチに固めるのとストレッチが効果があった。もちろん、休むのが大事で、土日にバ…

ひどい腱鞘炎になると半年たってもなおらない

はじめに 今後のため記録として残す。タイトルのとおりで、手が全て腱鞘炎という、ひどい腱鞘炎になって半年以上が経ったが、完治する気配がない。今でも寝起きや仕事終わりでは、人差し指や小指は曲げると激痛が走る。原因は手指の使いすぎなので、今の仕事…

近似最近傍探索ライブラリHnswlibのRuby bindingを作った

はじめに Hnswlibは、C++で書かれたHierarchical Navigable Small World graphsによる近似最近傍探索ライブラリである。近似最近棒探索のベンチマークでも上位に登場する。Ruby bindingがなかったので作成した。 hnswlib | RubyGems.org | your community ge…

インストール時にBLISをビルドしてNumo::Linalgのバックグラウンドライブラリに使用するGemを作成した

はじめに Numo::OpenBLASのBLIS版を作成した。Numo::OpenBLASを作ったのが、だいたい1年前だった。 インストール時にOpenBLASをビルドしてNumo::Linalgのバックグラウンドライブラリに使用するGemを作成した - 洋食の日記 BLISは、最適化BLASの一種で、線形…

RBSでメソッドをオーバーロードするときは三点リーダーを書く

はじめに タイトルのとおり。RBSによる型注釈が提供されているメソッドをmonkey patchして、その型注釈をpatch.rbsに書きたい時がある。Rubyのノリで書くと、重複定義エラーになる。 ディレクトリ構成 以降の文章は、次のようなディレクトリ構成で、 |- lib …

ひどい腱鞘炎になったので型注釈を書いている

はじめに タイトルのとおり。色々あって仕事でのタイプ量が急増したために、4月末頃からヒドい腱鞘炎に悩まされている。手首から先の曲がる箇所は全て曲げると痛い。朝起きてしばらくは、指が痛みで曲げられないほどで、仕事では、サポーターで手首から先を…