数値解析系

2024年7月 1日 (月)

ローカルLLM「Llama-3-ELYZA-JP-8B」にいろいろ聞いてみた

ElyzaのLlama3ベースの言語モデル「Llama-3-ELYZA-JP-8B」のRAGが予想以上に賢かった件: EeePCの軌跡」の記事で、いきなりRAGから入ってみましたけど、そもそも「Llama-3-ELYZA-JP-8B」自体の実力はいかほどか?を試してませんでした。
ということで、素のLlama-3-ELYZA-JP-8Bの実力を試してみます。

で、そのコードはこちら。

import sys
from llama_cpp import Llama
llm = Llama(model_path="models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
            n_gpu_layers=-1,
            verbose=False,
            )
output = llm("<user>\n" + sys.argv[1] + "\n<assistant>\n", max_tokens=512)
print(output['choices'][0]["text"] + "...")

これを「elyza_ggufllm3.py」という名前で保存しました。
RAGを使わないと、こんなに短くて済むんですね。
なお、環境設定は前記事を参照、量子化したモデルについても前記事同様、以下の「Files and versions」からダウンロードします。

elyza/Llama-3-ELYZA-JP-8B-GGUF · Hugging Face

使い方ですが、実行プログラムの後ろに質問文をつけるスタイルです。例えば、

> python elyza_ggufllm3.py お勧めの名古屋飯を教えてください。

という具合です。ちなみに、回答はうちのメインPCの場合、だいたい30秒ほどで返ってきました。

名古屋飯と言えば、独特の文化や歴史が育んできた食事スタイルです。名古屋で長く愛されている代表的な名古屋飯をいくつかご紹介します。

1. 名古屋コーチン親子丼:名古屋の地鶏「名古屋コーチン」は、卵を産むメスと雄を分けることで、脂肪が少なく肉質がきめ細かい特徴があります。親子丼は、タレに漬け込んだ親鳥と新生卵の黄身をどんぶりで提供します。
2. 手羽先天むすび:名古屋コーチンや地元の鶏肉を使った手羽先を、てんむす(手毬寿司)風に握っています。サクッと揚がった手羽先の食感と味わいは、名古屋のソウルフード。
3. 小倉トースト:小倉という名前に反して小豆は使われず、カステラやバターを使用したトーストです。愛知県民は長年この甘くて香ばしいトーストを朝食に食べることが多くあります。
4. 味噌カツサンド:味噌を付けることで名古屋風のアレンジがされた、名物の豚カツです。味噌とパンは意外にも合う組み合わせで、地元では人気の軽食。
5. 瀬戸焼きそば:瀬戸市に本社があるイタリアンレストラン「モリ・パニーニ」が創業したお店です。麺を焼くスタイルは新しい名古屋飯として若い人々からも支持されています。

これらの名古屋飯は、地元の人々の生活や文化に根付いた食事スタイルを表現しています。名古屋に訪れた際には、是非とも味わってみてください!

これが、回答文。なんかすごくないですか?たかが5GB未満のモデルですよ、これ。ただし、最後のやつがちょっと微妙。瀬戸焼そばが名古屋飯?うーん、惜しい。

調子に乗って、こんなことも聞いてみます。

Q : 月島の名物と言えばなんでしょうか?

「江戸前エルフ」にハマってたので、つい聞いてみました。

月島は、東京都中央区にありますが、「もんじゃ焼き」が有名です。月島は「もんじゃ焼き発祥の地」としても知られていて、多くのもんじゃ焼き店があります。もんじや焼きと呼ばれる小麦粉を用いた生地を鉄板で焼き、各種具材をトッピングして作るこの料理は月島が発祥であり、現在でも観光客や地元の人の人気を集めています。

東京というメジャーどころなためか、こちらはかなり正確な模様です。

さて、職場の活性化にお悩みなマネージャーっぽいことも聞いてみます。

Q : 部下のやる気を上げるための施策を5つ教えてください。

人間ならば答えにくい質問です。どんな回答が返ってくるか?

部下のやる気を上げるための施策は、以下の5つです。

1. 目標設定とフィードバック:
* 個人やチームに明確な目標を設定し、達成に向けてのプロセスを共有する。
* 定期的に進捗状況や結果に対してフィードバックを与え、改善点や成功要因を分析する。
2. 自主性と裁量権:
* 部下にできる限り任せて、自主性と裁量権を与えることで、モチベーションが向上し、主体的に仕事に取り組むことができる。
* 支援やサポートは必要に応じて提供する。
3. 成長機会の提供:
* 新しいスキルや知識の習得の機会を与えることで、部下の成長意欲を高める。
*外部研修やトレーニングプログラムなどを活用し、能力向上を目指す。
4.報酬とインセンティブ:
* 部下が仕事に取り組む動機付けとして、報酬やインセンティブを与えることが有効。
* 報酬の内容や方法は個人のタイプや好みに応じて選択する。
5.職場環境とコミュニケーション:
* 職場環境を整備し、部下が快適に仕事できるようにする。
*定期的に1on1ミーティングやチーム会議を開催して、コミュニケーションを促進し、部下の意見や要望を聞く。

これらの施策は、部下のやる気を上げるために有効ですが、個人のタイプや組織文化に応じて調整する必要があります。

わりと正論が返ってきました。1on1ミーティングが出てくるあたり、今どきの知識です。
でも、これができる上司ならば、最初から悩むことはないんじゃないか?という声も聞こえてきそうで・・・

ところで、このような生成AIをどう活用すればよいか悩まれている方も大勢います。直接、彼自身に聞いてみましょうか。

Q : 今後、生成AIを活用する方法として、どのようなものが ありますか?

で、そんなAI自身が答えたソリューションは以下。

生成AIは、多くの分野で応用が期待されており、以下にいくつかの例を示します。

1. **Chatbotsと自動化】: 生成AIの能力を使用して、チャットボットや会話型のアプリケーションを作成し、顧客サポートや問い合 わせに答えることができます。
2. **コンテンツ作成支援」:** 記事執筆、ソフトウェアドキュメントの自動生成、翻訳など、生成AIが人間の創造性を補助すること ができます。
3. **データ分析と可視化」:** 生成AIを使用して、複雑なデータセットから新しいインサイトやパターンを見つけることができたり 、可視化された結果を提供することができます。
4.「デザインの自動化」:** 設計、イラストレーション、ビジュアルエフェクトなどで生成AIを使用して、デザイナーの創造性を補助したり、自動化することができます。
5.「プログラミングとコード生成」:** 生成AIが自動的にコードを生成し、開発プロセスを高速化や生産性の向上などを実現することができます。
6.「アートとエンターテイメント」:** 様々な形式で生成した作品は、人々に新しい体験を提供する可能性があります。例えば、音楽や小説、映像などでの使用が想定されます。

上記は一例です。生成AIの能力は多岐にわたるため、将来的には、多くの分野で活用されることが期待されています。

3つ目以降は、ちょっとこのモデルでは無理なものも含まれてますね。ですがまあ、いいとこついているんじゃないでしょうか?

ローカルPC上で動く、モデルサイズが5GBにも満たない生成AIからの回答と思うと、なかなかすごいんじゃないですか。

つい1年前には、以下の記事にあるようなレベルだったんですが。

りんなチャットAI「rinna japanese-gpt-neox-3.6b」と楽しく??会話してみたら……: EeePCの軌跡

わりと的外れな会話で、当時はそれでも感動してましたけど、たった1年でこの進化です。

さらに1年後には、どれくらい発達しているんでしょうかね?


ご当地グルメコミックエッセイ まんぷく名古屋

2024年6月27日 (木)

ElyzaのLlama3ベースの言語モデル「Llama-3-ELYZA-JP-8B」のRAGが予想以上に賢かった件

昨日(6/26)に、東大発ベンチャーであるELYZA(イライザ)からLlama3ベースの言語モデル「Llama-3-ELYZA-JP」が発表されました。

「GPT-4」を上回る日本語性能のLLM「Llama-3-ELYZA-JP」を開発しました|ELYZA, Inc.

つい先日、Googleの大規模言語モデルを使った「notebookLM」に圧倒されたばかりですが、オープンモデルのELYZAも気になるので、試してみることにしました。

なお、GPT-4を超えたとされるのは、ELYZA‐JPの70Bモデル(700億パラメーター)であり、こちらはモデルとしては配布されておらず、APIとしての利用のみとなっている模様。
公開されているのは8Bモデル(80億パラメーター)のみです。

以前のLlama2ベースの時は、7Bと13Bの2種類が公開されていたのに、今回は8Bのみとは・・・などと残念に思ってましたが、むしろこの8Bモデル、以前の13Bモデルよりも高精度な言語モデルでした。

実際、8Bモデルでも日本語での性能はGPT-3.5 Turbo並みだというので、なかなか大したものです。

それの量子化モデルを入手し、以前の記事、

大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡

でやったRAGにトライしてみました。
なお、環境設定その他は上の記事の時そのままです。

モデルを、以下のサイトからダウンロードします。

elyza/Llama-3-ELYZA-JP-8B-GGUF · Hugging Face

ここのサイトの「files and versions」タブをクリックし、「Llama-3-ELYZA-JP-8B-q4_k_m.gguf」の横の下矢印をクリックしてダウンロードを実行します。

得られたモデル「Llama-3-ELYZA-JP-8B-q4_k_m.gguf」を、先のフォルダの「models」に入れておきます。

プログラムコードも先の記事ほぼそのままですが、一か所、「model_path = 」のところを、

model_path = f"models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf"

としました。このコードを、

> python elyza_rag.py

と実行すると、前記事同様、RAGが実行されます。

では、前回と同じ質問を投げかけてみます。

##Question: カルヒネン曹長の恩師の名前は?

その返答はというと、

カルヒネン曹長の恩師の名前は、ラハナスト先生です。

となりました。Llama2-7Bモデルではそっけなく「ラハナスト」としか答えなかったところを見ると、かなり人間的になりましたね。

ちなみに、8Bモデルということもあり、かなり軽いです。うちのGTX1650Tiを使っても、30秒ほどで回答が返ってきます。
(起動時は相変わらず遅い)

調子に乗って、もう少し高度な質問をしてみます。

##Question: イーサルミ王国はなぜオレンブルク連合皇国と戦争をすることになったのですか?

これ、Llama2のモデルでは支離滅裂な回答しか返ってこなかったのですが、Llama3ベースの今度のモデルは違います。

イーサルミ王国は、オレンブルク連合皇国の属国であったが、現皇帝が即位してから圧政を敷き、高い税負担や言論統制などを行ったため、イーサルム王国内は大いに乱れた。さらに、強大化した軍隊が属国への干渉を働くこととなり、悪循環を招いた。そこで、イーサルミ王国は連合皇国からの独立を宣言し、オレンブルク連合皇国軍に対して奇襲を行い、これを一斉排除することに成功したが、その後、苛烈な独立戦争が始まった。

ちゃんと、文脈を捉えた回答が返ってきました。これは予想外でした。
Llama3ベースのモデルって、優秀過ぎない?

もちろん「notebookLM」あたりと比べたらまだまだでしょうけど、やっすいゲーミングPC上で実行していることを思えば、これはなかなかの性能です。

てことで、さらに調子に乗って、より突っ込んだ質問をしてみました。

##Question:イーサルミとオレンブルクの戦いは、この先どうなると思いますか?

この物語の先を予想させてみました。文脈を読んで、彼(Llama3-ELYZA-JP)はなんと回答するのか?

銃が飛ぶように売れては犯罪の誘発などにつながって困りものだが、計算尺なら飛ぶように売れたところで誰も困らない」という会話から、イーサルミ王国とオレンブルク連合皇国の戦争が長期化していることがわかります。

また、「我々の独立を承認することは他の王国の独立を誘発しかねないと考えている」や「多数の国が連合する皇国にとって、それらの国の離脱が最も恐れるべき事態だ」という会話から、オレンブルク連合皇国はイーサルミ王国の独立を認めるつもりはないことがわかります。

さらに、「我々は決して屈しない。やつらが我が国の独立を認めるまで、我々は戦い続ける」という会話から、イーサルミ王国は独立するために戦争を継続する意思があることがわかります。

以上の情報から、イーサルミ王国はこの先もオレンブル

なんか、最後はちょっと途切れてしまいましたが、要するにオレンブルクとイーサルミの戦争はまだまだ続くと言いたかったのでしょう。そういう流れの回答です。
ただし、この回答ばかりは80秒ほどかかりました。かなり頭?を使ったようです。ですが、使っただけの回答です。恐れ入ります。

ということで、予測的なことまで可能となったLlama3ベースの8BモデルによるRAGは、なかなか使えそうです。

今回は「計算士と空中戦艦 : 小説家になろう 」の第1章のみでしたが、第2章まで読み込ませて、より突っ込んだ質問をしてやりたいですよね。


面倒なことはChatGPTにやらせよう (KS情報科学専門書)

2024年6月24日 (月)

Googleの生成AI「Gemini 1.5 Pro」を使ったサービス「notebookLM」がすごいらしいので試してみた

GoogleがOpenAIのGPT 4に対抗して「Gemini 1.5 Pro」という生成AIを作っているということは知ってましたが、これの使いどころを知りませんでした。
が、最近、このGemini 1.5 Proを使った「notebookLM」というサービスがあることを知ったので、早速使ってみました。

NotebookLM | Note Taking & Research Assistant Powered by AI

20240623-193057

上のサイトで「Try notebookLM」をクリックします。
Google ChromeでGoogleアカウントにログイン済みならば、いきなり入れるはずです。

さて、このnotebookLMですが、OpenAIのChatGPTの最新版(GPT-4o)と比較して、いくつかメリットがあります。

・ 扱えるコーパス量が多い
・ 日本語の精度についてはGPT-4o以上

これはGoogleのひとから聞いたのですが、コーパスがChatGPTに比べてかなり多いとのことです。
コーパスが多いというのは、つまり大量の文章を処理できるということ。RAGでも使わない限り、通常のGPTならば数千文字程度しか一度に読み込んでくれないので、これは大きい。
地味に日本語読解力が強いというのもありがたいことです。

さらに、期間限定ですが、

・ 今なら無料で試せる

というところが一番大きいかと。

ということで、「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の際に使用したテキストファイルを使って、いろいろとやらせてみました。

Try notebookLMをクリックすると、以下のような画面が出てきます。

20240623-193116

まずは、

計算士と空中戦艦 : 小説家になろう

の第1部 全19話、約11万文字のテキストを一つにまとめておきます。

この前準備をした後に、「新しいノートブック」をクリック。

20240623-193128

こんなのが出てきます。
で、今回はテキストファイルなので、「テキストファイル」を選択して、先ほど準備したテキストファイルを選びます。

20240623-190644

しばらく読み込んだ後に、概要や質問の候補などが表示されます。
この時点で、驚くほど正確に内容把握していることが分かります。

これは期待大。

ということで、先日のRAG以上の質問を投げかけてみました。

Q:この物語の概要を教えてください。

上にも概要が出てますが、改めて聞いてみました。すると、

物語のあらすじ

 この物語は、イーサルミ王国とオレンブルク連合皇国の戦争を描いています。

●主人公: ユリシーナ・カルヒネン曹長は、イーサルミ王国空軍所属の砲術計算士です。3年前にオレンブルク連合皇国の空襲で家族を失い、復讐のため計算士の道を選びました。
●イーサルミ王国: ヘリウム採掘場を独占する資源の豊かな国。オレンブルク連合皇国からの独立を宣言後、3年間戦争が続いています。
●オレンブルク連合皇国: 資源の乏しい国で、イーサルミ王国を属国としようと侵攻を続けています。ヘリウム不足のため、危険な水素を空中戦艦に使用しています。
●空中戦艦: 物語の舞台となる空中戦艦は、ヘリウムガスで浮遊し、大砲や爆弾を用いて戦います。主人公は「ヴェテヒネ」、「サウッコ」という名の空中戦艦に搭乗します。
●戦闘: 主人公は、卓越した計算能力で敵艦を撃沈し、イーサルミ王国空軍の勝利に貢献します。その功績により、異例の金三等勲章を授与されます。
●計算機: ラハナスト先生という計算工学の権威が、画期的な電子手順計算機を開発します。この発明は、将来、戦争のあり方を変える可能性を秘めています。
●戦争の終結: 物語終盤で両国の和平交渉が始まりますが、ヘリウムの供給を巡る対立などから、交渉は難航が予想されます。

 主人公は、戦争の悲惨さを目の当たりにしながらも、計算士としての職務を全うし、祖国の勝利のために戦い続けます。物語は、戦争の終結を予感させつつも、新たな戦いの始まりを予感させながら幕を閉じます。

予想以上に、詳細なあらすじが返ってきました。
書いた本人なので分かりますが、かなり正確ですね、これ。

となれば、こんな質問もしたくなります。

Q:この物語の続きとして、どのような展開が考えられますか?

物語の続きを考えさせてみました。
で、返ってきたのは以下の答え。

物語の今後の展開の可能性

 今回の物語の続きとして考えられる展開は、新たに発生したオレンブルク軍の動きと、主人公たちの動向、そして戦争の終結に関する点に集約されます。

●新たな敵の出現: 主人公たちが所属するイーサルミ王国空軍は、偵察艦撃沈後、オレンブルク軍の動きがないことに不気味さを感じています。
 これは、嵐の前の静けさであり、オレンブルク軍が何か大きな作戦を企てている可能性を示唆しています。
 具体的な展開としては、これまで登場していない新型の空中戦艦や、新たな戦術を引っ提げての攻撃などが考えられます。
 主人公たちのこれまでの活躍により、オレンブルク軍も戦術の見直しを迫られている可能性があります。
●主人公たちの次の戦い: 主人公であるカルヒネン曹長は、新しい計算尺を入手し、それを試す機会を待ち望んでいます。
 次の戦いでは、この新しい計算尺を用いて、これまで以上の精度で敵艦を攻撃することが予想されます。
 また、物語終盤でエクロース准将が、人命を損耗しない兵器として、計算機に爆弾を積んで突撃させる構想を語っています。
 この発言は、今後の戦争の行く末を示唆しており、主人公たちの前に、計算機を兵器として利用しようとする新たな敵が立ちはだかる可能性も考えられます。
●戦争の終結: イーサルミ王国とオレンブルク連合皇国の間で和平交渉が始まったことが語られています。
 しかし、両国の主張は大きく異なっており、交渉が決裂する可能性も高いです。
 特に、ヘリウムの供給を巡って対立が深まる可能性が示唆されています。
 もし交渉が決裂した場合、戦争はさらに激化し、主人公たちもより危険な戦いに巻き込まれることが予想されます。
 主人公たちの活躍が、和平交渉の行方にも影響を与える可能性も考えられます。

 これらの要素を組み合わせることで、様々な展開が考えられます。例えば、和平交渉が続く中で、新たな敵が現れ、主人公たちがその戦いに巻き込まれるという展開や、和平交渉が決裂し、全面戦争に突入する中で、主人公たちが重要な役割を果たすという展開などが考えられます。

実は第2部(全16話)がすでに書き上げられてますが、特に1つ目、3つ目については確かに第2部の中で描かれてます。
なかなか賢いですね、これ。

では、さらに突っ込んだ質問を。

Q:現実世界での第一次世界大戦を参考に、この物語を広げるとしたならば、どのような展開が考えられますか?

創作と現実世界を掛け合わせた回答を求めてみました。さあ、どう答える!?

 現実世界での第一次世界大戦を参考に、物語をどのように広げられるかについて、ソースからは断定的な情報は得られません。
 しかし、いくつかの手がかりはソースから見つかります。

●新兵器の登場: 現実の第一次世界大戦では、戦車や毒ガスなど、それまでの戦争の常識を覆す新兵器が登場しました。
 ソースでは、電子手順計算機という画期的な計算機が登場します。
 これは、現実世界のコンピュータの原型ともいえる発明であり、戦争のあり方を大きく変える可能性を秘めています。
 今後、この電子手順計算機が兵器に応用され、新たな戦術や戦略が生まれる展開が考えられます。
●情報戦の激化: ソースでは、敵の偵察艦の動きが活発化し、主人公たちが所属するイーサルミ王国空軍も、偵察艦の撃沈に成功しています。
 現実世界の第一次世界大戦でも、航空機による偵察や、無線通信の傍受など、情報収集の重要性が高まりました。
 この物語においても、電子手順計算機を駆使した暗号解読や、敵の行動予測など、情報戦が激化する展開が考えられます。
●多国籍軍の編成: ソースでは、イーサルミ王国はフロマージュ共和国から空中戦艦の技術供与を受けています。
 現実世界の第一次世界大戦でも、複数の国が同盟を組んで戦いました。この物語においても、フロマージュ共和国が軍事介入したり、新たな国が参戦したりする可能性があります。
●戦線の膠着: 現実世界の第一次世界大戦では、塹壕戦と呼ばれる長期にわたる戦線膠着状態が生じました。
 ソースでも、イーサルミ王国とオレンブルク連合皇国の戦争は3年間続いており、キヴィネンマー要塞周辺などでは塹壕戦が行われています。
 今後、物語の中でも、戦線が膠着し、長期戦に突入する展開が考えられます。
●厭戦気分の高まり: 現実世界の第一次世界大戦では、長期化する戦争によって、国民の間で厭戦気分が高まりました。
 ソースでは、主人公の同僚であるマリッタが「さっさと終わらせてほしい」と戦争に対する本音を漏らしています。
 今後、物語の中でも、戦争の長期化によって、兵士や国民の間で厭戦気分が高まり、和平を求める声が大きくなる可能性があります。

 これらの要素を組み合わせることで、現実世界の第一次世界大戦を参考に、物語をより複雑化・多層化することが可能になると思われます。ただし、これらの展開はあくまでも可能性であり、実際に物語がどのように展開するかは、作者の判断によります。

なかなかどうして、現実知識を上手く取り混ぜながら、物語の世界観を継承しつつ今後の展開予測を描いています。
では、もうちょっと細かい質問も投げてみます。

Q:電子手順計算機の発明は、戦争にどのような影響を与える可能性がありますか?

この物語では、かなり初期の電子計算機が登場します。これの与える影響についても聞いてみました。
で、回答ですが、

 提供された情報源では、電子手順計算機の発明が戦争にどのような影響を与える可能性があるかについては明確に述べられていません。
しかし、これらの情報源は、計算尺や計算工学の重要性、そしてそれが戦争においてどのように利用されているかについて詳しく説明しています。
 例えば、計算士は計算尺を用いて敵の進路予測や弾道計算を行い、戦争の勝敗に大きく貢献しています。 また、電子手順計算機は従来の計算尺よりも高速かつ正確に計算を行うことができ、将来的には人間の役割を担う可能性も秘めていることが示唆されています。

こちらも、現実世界と合わせた答えを出してきました。

まあ、ひと言で言って「凄い」ですね。
当然と言えば当然ですが、オープンモデルの7b(70億パラメータ)モデルなんて、歯が立ちません。
やっぱり、大規模も大規模な言語モデルだけあって、強烈です。

ちなみに、まだGPT-4oは触ったことはないですが、あちらもきっと強烈なんでしょうね。
ですが、こちらは無料でここまで使えてしまうという点で、圧倒的です。

いずれは有料サービスに切り替わるはずですが、今はまだ無料。

最新の生成AIに触れてみたいという方は、ぜひこの機会にお試しあれ。


生成AIプロンプトエンジニアリング入門 ChatGPTとMidjourneyで学ぶ基本的な手法

2024年6月21日 (金)

大量の画像ファイルからOpenCV使って特定の顔が映ってる写真だけを抜き出すやつを作った

タイトルの通りです。必要性に迫られて、ある顔が映っている画像ファイルを選別して抜き出すやつを作ってみました。
長男の卒業式写真をもらったんですが・・・約740枚もあって、とんでもない量が送られてきました。容量も全部で11.2GB。
いやあ、いくらなんでも740枚は多過ぎだろう。欲しいのは、自分の子供が映っているやつだけなんだけど。
ちょっと、学校側は張り切り過ぎです。

てことで、

1.テンプレート画像となる顔画像を用意
2.740枚の画像が入ったフォルダ「data」の1枚1枚を読み込み、顔検出する
3.その検出した画像とテンプレート画像の顔をと比較し、類似度を計算
4.類似度がある一定以上の顔画像を含む画像ファイルを「result」というフォルダにコピーする

というプログラムを作りました。

いわゆるディープラーニングの画像認識を使わず、OpenCVのみとしました。なんせ、740枚も処理するので、畳み込みニューラルネットワーク(CNN)では時間がかかり過ぎです。このため、簡易な方法を選びました。

具体的には、顔検出にはhaar-like特徴分類器を、類似度計算に使う画像特徴量にはSIFT特徴を、2つの画像の特徴量のマッチングにはBFMatcher、つまり総当たりのアルゴリズムを使ってます。

で、作ったのが以下のプログラムです。
(「face_pickup.py」という名前にしました)


import cv2
import numpy as np
import os
import shutil
# 顔を検出する関数
def detect_faces(image):
    # Haar-like特徴分類器を使用して顔を検出
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=10, minSize=(200, 200))
    return faces
# SIFT特徴抽出器を作成する関数
def create_sift():
    sift = cv2.SIFT_create()
    return sift
# 画像の特徴量を計算する関数
def compute_features(image, sift):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = sift.detectAndCompute(gray, None)
    return keypoints, descriptors
# マッチングを行い、類似度を計算する関数
def match_features(des1, des2):
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    good_matches = []
    try:
        for m, n in matches:
            if m.distance < 0.75 * n.distance:
                good_matches.append(m)
    except ValueError:
        pass
    similarity = len(good_matches) / max(len(des1), len(des2))
    return similarity
# メインの処理
def main():
    # 顔検出用の画像を読み込む
    face_image = cv2.imread('face.jpg')

   
# dataフォルダ内の画像を読み込む
    images_folder = 'data'
    images = [f for f in os.listdir(images_folder) if os.path.isfile(os.path.join(images_folder, f))]

    # SIFT特徴抽出器を作成する
    sift = create_sift()
    # 類似度のしきい値
    similarity_threshold = 0.065

    # 類似度の高い顔が含まれている画像をresultフォルダにコピーする
    for image_file in images:
        image_path = os.path.join(images_folder, image_file)
        image = cv2.imread(image_path)
        # 顔を検出する
        faces = detect_faces(image)

        if len(faces) > 0:
            # 顔の特徴量を計算する
            face_keypoints, face_descriptors = compute_features(face_image, sift)
            max_sim = 0.0
            similarity = 0.0
            for (x, y, w, h) in faces:
                detectface_image = image[y:y+h,x:x+w]
                image_keypoints, image_descriptors = compute_features(detectface_image, sift)
                # 類似度を計算する
                if image_descriptors is not None:
                    similarity = match_features(face_descriptors, image_descriptors)
                if similarity>max_sim:
                    max_sim = similarity
            print(image_file, ',', len(faces), ',', max_sim)
            # 類似度がしきい値以上の場合、resultフォルダにコピーする
            if max_sim > similarity_threshold:
                result_folder = 'result'
                if not os.path.exists(result_folder):
                    os.makedirs(result_folder)
                shutil.copy(image_path, os.path.join(result_folder, image_file))
    print("類似度の高い顔が含まれている画像のコピーが完了しました。")
if __name__ == '__main__':
    main()

実は、Bing Chatで作らせたんですが、エラーだらけでして、これを修正してまともに動かせるように変えてます。
ChatGPTもかなり進化してますが、なかなかそのまま使えるコードをいきなりは作ってくれませんね。

これと、顔画像を検索させたい画像ファイルを「data」というフォルダにぶち込んでおきます。
使うライブラリは、OpenCV、numpy辺りがあれば使えます。
さらに、face.jpgという名前で、検索したい顔画像を用意しておきます。

Face

ぼかしのおかげでちょっとヤバい感じの写真ですが、これがテンプレート画像です(もちろん、実際にはぼかし無しです)。

20240620-194645

フォルダ構成は以上のようになります。
プログラム本体「face_pickup.py」以外には、検索させたい画像をおさめた「data」フォルダ、抜き出した画像をおさめた「result」フォルダ、テンプレート画像「face.jpg」を用意します。
(「result」フォルダはなくても自動で作られます)

これで、準備完了。

実行は、コマンドプロンプトなどでこのプログラムの入ったフォルダに移動して、

python face_pickup.py

です。

20240620-200511

こんな感じに実行されます。ファイル名、検出された顔画像の数、そしてその中で一番高い類似度の値、の順に表示されます。

なお類似度の閾値は、プログラム中ほどにある「similarity_threshold = 0.065」の0.065の値を調整します。
これを決めるために、最初は2、30枚くらいの画像でトライした方がいいでしょう。

で、閾値を決めたら、740枚を一気に走らせます。

20240620-193504

で、出てきた結果がこれ。数分ほどで処理は完了。結果、だいたい200枚くらいが拾われました。
ですが、結構余計な画像が多いですね。顔ですらない画像も中には含まれてました。
それらを削ると、残ったのは結局100枚くらい。

さほど精度がいいとは言い難いですが、740枚から1枚1枚探ることを考えると、これでもかなりマシです。
おそらくですが、何枚かは欠落しているかと思いますが、これだけ取れれば十分かと。

最初、妻が全部見て選ぶ言ってたんですが、途中で音を上げました。
そんな妻に、Pythonの威力とやらを見せつけてやりましたよ。ほんと、OpenCVの画像処理サマサマです。

高精度なCNNを使わずとも、OpenCVだけでもここまでのことはできるんです。ご参考まで。


Pythonと深層学習による革新的な画像認識と処理の裏技~CNNとOpenCVで実現する顔認識、物体検出、画像分類のテクニック~

2024年6月16日 (日)

YOLOXで独自データを使ってモデルを作ってみた

ずっと昔にYolov3の独自データ学習をして以来、長らく物体検出手法の学習を試してませんでした。
が、業務上、新しい物体検出を使って独自データでの学習をする羽目になったため、久しぶりにやってみることにしました。

ここで使う手法はYOLOX、またアノテーションツールには「VoTT」を使います。

なお、YOLOXの独自データの学習にはGPUが必須、CUDAのインストール、PytorchもGPU版が必要です。

(0) YOLOXのダウンロード、前準備、動作確認

まずは、これを入手しておきましょう。
今回使うのは、以下のサイトから入手するYOLOXです。

GitHub - Megvii-BaseDetection/YOLOX: YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/

Windowsなら、「<>Code」をクリックして「Download ZIP」を選択すると、ZIPファイルがダウンロードされます。
これを解凍し、適当なフォルダに入れておきましょう。
(我が家では「C:\linux」というフォルダの直下に「YOLOX-main」として入れました)

まずはこれを使えるようにします。

Windows PowerShellを開き、「cd c:\linux\YOLO-main」と入力して上のフォルダに入ります。

我が家では「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の記事にある通り、CUDA 12.1を入れてあるので、

pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121

と、PytorchのCUDA 12.1版を入れておきました。

それ以外にも、

numpy
opencv_python
loguru
tqdm
torchvision
thop
ninja
natsort

tabulate
psutil
tensorboard

辺りのライブラリも入れてください。
他にも「pycocotools」をインストールしなきゃならないんですが、これを入れるには「VS Build tools 2022」が必要です。

Microsoft C++ Build Tools - Visual Studio

(インストール方法は、「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」の前準備を参照)

ついでに、環境変数に以下の設定を入れてください。

下の「検索」で「環境変数」とやると、環境変数の設定窓が開けるので、そこにあるPath

C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\IDE

を加えます。

また、「LIB」という変数を作成し「C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x64; C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x86; C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86」を記入。

INCLUDE」という変数には「C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.39.33519\include; C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt

と入れておきます。

(時期や環境によっては、2022や14.39.33519の数値が違うことがあります。Program Filesの中を確認し、それぞれの環境に合わせたフォルダ名を記入してください)

これをやらないと、先の学習時にエラーが出ます。

あと、YOLOX-mainの中に「setup.py」があるんですが、これは実行しないでください。
何かと不具合が起きやすいので、これを利用しない方法で書きます。

今後のために、以下のファイルを「YOLOX-main」の直下にコピーしておきます。

tools\train.py
tools\demo.py

また、学習モデル「yolox_nano.pth」を以下からダウンロードし、YOLOX-mainの直下に入れておきます。

https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_nano.pth

適当な動画ファイルをつかって、動作確認をします。

python demo.py webcam -n yolox-nano -c .\yolox_nano.pth

なお、この後必要となるので、このフォルダ内に「data」というフォルダを、「datasets」フォルダの下に「COCO」というフォルダを作っておきます。
ちなみに「data」フォルダには、学習させたい画像ファイルを入れておきます。

(1) VoTTで学習データ作成(アノテーション)

まずは、以下からVoTTを入手します。

Releases · microsoft/VoTT

「Assets」の下の「vott-2.2.0-win32.exe」をクリックすると、ダウンロードされます。
ダウンロードが終わったら、これをダブルクリックしてインストールします。

デスクトップにあるvottのアイコンをダブルクリックすると、以下のような画面が出てきます。

20240615-103844

ここでは、新規プロジェクトをクリック。

20240615-104913

すると、こんな感じの画面が出てくるはずです。
表示名は、適当でいいです(ここではtestとしました)。

その下のソース接続、ターゲット接続ですが、ここはそれぞれ先ほど作った「data」と「datasets-COCO」を選びます。

20240611-203735

それぞれの接続の横にある「Add Connection」をクリックすると、上のような表示が出ます。
表示名は適当に入れて、プロバイダーは「ローカルファイルシステム」とすると、その下に「フォルダを選択」というのが出てくるので、フォルダを選択して「接続を保存」をクリックします。

あと、下にある「タブ」には、今回作りたいラベル名を入れておきます。

なお、今回は子供の運動会の画像から「人」と「帽子」を検出するものを作ることにしました。なので、ここは「human」「hat」と入れておきます。

20240615-104830

そこまでできたら、プロジェクトを保存、とします。

20240611-203848

すると、dataフォルダ内にある画像を読み込み、こんな感じの画面が出てきます。
ここで、アノテーションという作業を行います。
具体的には、検出したいものを選択し、ラベル付けするという作業です。これが結構大変。

20240611-203904

まずは、人を囲みます。

20240611-203918

囲んだ後に、右上の出てくるリストから「human」を選択すると、この枠にhumanというラベルが付けられます。
なおこの場合、1つ目が「human」、2つ目が「hat」となっているので、枠を選んだ後に数字の1キーを押すと「human」、2を押すと「hat」とラベル付けされます。
この数字キーでのラベル付けはすごく便利です。

20240611-204514

そんな調子で、じゃんじゃんラベル付けをしていきます。
だいたい1枚の画像から20個程度の人、帽子のラベルを作成、これを25枚ほどやりました。

たった26枚でも、地獄の作業でした。

この作業を終えて保存する前に、画面左の真ん中編にある斜め上矢印のアイコン「エクスポート」をクリックします。

20240611-210004

以下のような画像が出てくるので、プロバイダーを「Pascal VOC」、アセットの状態を「訪問済みアセットのみ」として「エクスポート設定を保存」をクリックします。

その後に、今度は画面上にある、斜め上矢印をクリックします。
すると、アノテーションデータが保存されたというメッセージが出てきます。
これで、学習データの作成は完了です。

※ VoTTは画像だけでなく、動画データからもアノテーションすることが可能です。
 が、Windowsの場合は次の変換以降が上手くいかないので、必ず動画を複数枚の静止画にしてからアノテーションするようにしてください。

(2) Pascal VOC⇒COCOへの変換

YOLOXは学習モデルをCOCOの形式に変換してやる必要があります。
このため、Pascal VOC⇒COCOへ変換するコマンドを使います。

以下のサイトで、「<>Code」から「Download ZIP」を選択。

GitHub - tatsuya-fukuoka/convert_pascalvoc2coco: VOTTで出力したPascal VOC形式のXMLファイルをCOCO形式のJSONファイルへ変換するスクリプト

ダウンロードされたZIPファイルを解凍し、出てきた「convert_pascalvoc2coco-main」というフォルダを「YOLOX-main」の直下に入れます。

「datasets\COCO」の中にあるフォルダ(「test-PascalVOC-export」という名前)を「convert_pascalvoc2coco-main」の中に移動してやります。

そこで、Windows PowerShell上で上のフォルダに移動後、

python convert_vott_voc2coco.py test-PascalVOC-export

と実行。すると[YYYYMMDD_HHMMSS]_COCO_Formatという名前のフォルダができます。
その中にあるフォルダ、ファイル類をごっそり「datasets\COCO」の中に入れます。

(3) 学習実行

いよいよ、学習実行です。
が、ちょっと前準備が必要。

「exp\example\custom」というフォルダにある「nano.py」というファイルを開きます。
その中にある「self.data_dir = "datasets/coco128"」を「self.data_dir = "datasets/COCO"」に書き換えます。

また、self.var_annの下あたりに「self.max_epoch = 300」「self.num_classes = 2

を追記しておきます。(num_classesは自身で作ったラベル数に変えてください)


        self.data_dir = "datasets/COCO"
        self.train_ann = "instances_train2017.json"
        self.val_ann = "instances_val2017.json"

        self.max_epoch = 300
        self.num_classes = 2

こんな感じになっていればOK。

また、ラベル名については、「yolox\data\datasets」にある「coco_classes.py」の中の「COCO_CLASSES = (」以下を書き換えます。今回の場合は、下のようになります。


COCO_CLASSES = (
"human",
"hat",
)

ここは変えなくても動きますが、おかしなラベル名になるので変えておいた方が無難です。

ここでようやく、学習を実行します。

python train.py -f exps/example/custom/nano.py -d 1 -b 16 --fp16 -o --cache

すると、こんな画面が出てきます。

20240615-093303

うちの環境(GTX1650Ti)だと、だいたい30分くらいで300エポックが実行されました。

終わると、「YOLOX_outputs\nano」に~.pthという学習モデルが大量に入っているはずなので、そのなかの「best_ckpt.pth」をYOLOX-mainの直下に移動しておきます。

そこで、適当な動画ファイル(ここでは0002.mp4)を使って推論してみます。

python demo.py video -f exps/example/custom/nano.py -c best_ckpt.pth --path 00002.mp4 --conf 0.3 --tsize 640 --save_result --device gpu

すると「YOLOX_outputs\nano\vis_res」の下にフォルダが作成されて、その中にアウトプットされた動画ファイルが入ってます。

20240615-094221

こんな感じで、ちゃんと?推論されてました。
というか、ちょっとhumanが過検出されてる感はありますが。
(ついでに言うと、humanとhatのラベルがなぜか逆でしたが)

まあ、とりあえず動くことは動きました。
あとはたくさんアノテーションをしてやればよさそうです。

なお、tensorboardを使って学習の状況を確認できます。

tensorboard --logdir .\YOLOX_outputs\nano\tensorboard

とコマンド入力し、下に出てきた「http://localhost:6006」をCTRLキーを押しながらクリックすると、ブラウザが開いてグラフが表示されます。

20240615-094411

これを見ると、100エポックくらいまでは全然学習されてなくて、300の手前で頭打ちになってます。
学習データのアノテーションが、いい加減 or 少なすぎたんですかね?

いずれにせよ、これで独自データによる学習ができました。

実用上はonnx形式に変換してやりたいところ。そうすれば、Raspberry Pi辺りで動かせるんですけどね。まだそちらは上手くいってません。


物体検出とGAN、オートエンコーダー、画像処理入門 PyTorch/TensorFlow2による発展的・実装ディープラーニング

2024年5月25日 (土)

先日の「ローカルLLM+RAG」をGPU上+より大規模モデル(13b)でも動かせるようにしてみた

つい先日に「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」という記事を書いたばかりですが、あれはCPUが前提でした。

が、やはりもっと大きなモデル使いたいし、GPU対応にもしておきたい、ということで追加でやってみました。

以下、元記事(大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡)ができているという前提で、その先にやる手順を書きます。

CUDA 12.1の導入

pytorchとllama-cpp-pythonの両方に対応しているCUDAということで、12.1を使うことにしました。

インストールの方法は、

CUDA Toolkit 12.1 Downloads | NVIDIA Developer

からインストーラーをダウンロードし、それをダブルクリックしてインストールするだけです。

なお、最近のpytorchではcuDNNは不要らしいですが、心配な方は、

cuDNN Archive | NVIDIA Developer

から最新の一つ古いくらいのバージョンをダウンロードしておくといいでしょう。

pytorchのGPU対応

pytorchの公式サイト

Previous PyTorch Versions | PyTorch

にある通り、以下のコマンドを入れます。
(CPU版から上書きするコマンドにしてます)

> pip install --upgrade --force-reinstall torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121

ここではとりあえず、前回と同じバージョンのtorchにしておきました。

llama-cpp-pythonのGPU版インストール

以下のコマンドを入れて、入手します。

> pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121 --upgrade --force-reinstall --no-cache-dir

なお、llama-cpp-pythonのバージョンは前回の0.2.20から0.2.75と上がりますが、この方がCPU動作時でも早くていい感じでした。

13bモデルダウンロード

前回同様、gitで13bのモデルをダウンロードします。

> git lfs clone https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-13b-fast-instruct-gguf/ --include "ELYZA-japanese-Llama-2-13b-fast-instruct-q8_0.gguf"

この「-fast-」とついたモデルは、精度そこそこで1.8倍速いらしいので、こっちを使うことにします。

プログラムコードの変更

先の記事にあった「elyza_rag.py」の中身で、以下の3か所を書き換えます。

(旧)

model_path = f"models/ELYZA-japanese-Llama-2-7b-instruct-gguf/ELYZA-japanese-Llama-2-7b-instruct-q8_0.gguf"

(新)

model_path = f"models/ELYZA-japanese-Llama-2-13b-fast-instruct-gguf/ELYZA-japanese-Llama-2-13b-fast-instruct-q8_0.gguf"

(旧)

llm = LlamaCPP(
    model_path=model_path,
    temperature=0.1,
    model_kwargs={"n_ctx": 4096, "n_gpu_layers": 32},

(新)

llm = LlamaCPP(
    model_path=model_path,
    temperature=0.1,
    model_kwargs={"n_ctx": 4096, "n_gpu_layers": -1},

(旧)


EMBEDDING_DEVICE = "cpu"

(新)


EMBEDDING_DEVICE = "cuda"

書き換えたものを、別の名前で保存しておきます。
(ここでは「elyza_rag_13b_gpu.py」としておきます)

実行

あとは、普通に実行です。

> python elyza_rag_13b_gpu.py

GPU対応されたとはいえ、起動直後のインデックス化作業はそこそこかかります(数分)。

なお、我が家はメインメモリーが64GBGPUがGeForce GTX1650Ti (GPUメモリー 4GB)という環境であるため、全然GPUメモリーが足りません。
が、メインメモリーの内、最大で半分までをGPUメモリーとして使える(共有GPUメモリ―として認識)ため、どうにか動きました。

20240525-133250

実行中のメインメモリーはこんな感じ。

20240525-133249

GPUの方も共有を含め、かなり目一杯使ってます。

そんな環境下ですが、前回と同じ質問を投げかけてその回答時間を比較します。
よく見たら、推論時間が回答の直上に書かれていたので、それを貼り付けます。
(CPUでも13bモデルを走らせての比較です。)

(CPU版)

20240525-132219

(GPU版)

20240525-130244

ざっと4分弱 → 2分強程度まで縮まりました。
残念ながらGPUがしょぼいので、さほど高速化の実感はありませんが、それでも速いことは速い。

さて、せっかくモデルのサイズを大きいものにしたので、それを実感できる文例を期待してます。
ということで、前回はおかしな回答か、あるいは回答不可と出た質問文を投げかけてみます。

## Question: ヴェテヒネンでのビスケットの食べ方は?

## Answer:
私は石のように硬いビスケットを豆スープに突っ込むと、少しだけ水分を含んで柔らかくなったそれにかじりつく。歯が折れそうな ほどの硬いビスケットを二欠け程口に含んだところで、豆スープを一気に流し込む。さらに干し肉にもかかじりつくと、今度はその独特の臭みをごまかすため、紅茶で口の中を洗浄する。

うん、まあ、文章を抜き出してきただけのような気がしますが。間違ってはいない。

## Question: ヴェテヒネンの乗員は何人いますか?

## Answer:
26名です。

これは簡単だったかな?でも7bモデルでは「回答できません」的なことを言われました。

## Question: 中央計算局とは?

## Answer:
中央計算局は真四角なコンクリート製で、窓がほとんどない殺風景な建屋だ。近所に並び立つ貴族街の優美で荘厳な屋敷や、窓の多 い軍司令本部の建物と比べると、味気ない場所ににしか見えない。

建物の特徴ではなく、何をするところかを聞きたかったんですが、質問が悪いですかね。

ということで、2分ほどで前回よりも良質な回答ができるようになりました。
が、読ませる文書ファイルがあまり良くないですね。できれば、もうちょっとビジネス文書的なもので試してみたいところです。


面倒なことはChatGPTにやらせよう (KS情報科学専門書)

2024年5月23日 (木)

大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた

今さら感はありますが、大規模言語モデル(LLM)を独自の文章データでカスタマイズする手法の一つである「RAG」を使って、実際に使えるようにするところまでやってみました。

参考にしたのは、以下のサイト。

LlamaIndexを使ってローカル環境でRAGを実行する方法 - 電通総研 テックブログ

このサイト通りやれば楽勝・・・と思っていた自分を呪いたい。

Windows版Pythonで、しかもWSL2などを使わずにRAGをやろうというのが、本来無茶なのかもしれない。
が、チピチピチャパチャパしながら、どうにかRAGの動作環境を構築しました。

ということで、「Windows上でそこそこのLLMを使ってRAGしてみたい」と言う人のために、手順をここに残します。

なお、我が家のメインPCと会社PCの両方で動かしました。
最低ラインのハードは、「4コアCPUとメモリー16GB」だと思ってください。
(正直、とても実用レベルではありませんが)

RAGとは?

その前に「RAG」ってなんやねん?という方のための解説。

RAGとは「Retrieval-Augmented Generation」の頭文字で、簡単に言うと「LLMに外部の知識データベースを検索させて回答を生成させる」手法で、学習なしで独自データを用いた文書生成を可能にする技術です。

学生に例えると、通常の機械学習が「試験勉強」ならば、RAGは「辞書や教科書を見ながら回答する」ようなものです。

前準備

うちでは、Windows版Python 3.10.9を使って構築します。まだ持っていないという方は、以下から入手が便利です。

非公式Pythonダウンロードリンク - Python downloads

以下、C:\linuxというフォルダを作って作業しているものとします(フォルダ名は英数字なら何でもOK)。
まずは、コマンドプロンプトかWindows PowerShellにて、

> cd c:\linux

と移動しておきましょう。

はじめに「仮想環境」を作ります。
すでにPythonにライブラリを入れているという方は、必ずやっておいてください。その環境が壊れる恐れがあります。
私の場合は「rag」という名前の仮想環境を作りました。コマンドプロンプトかWindows PowerShellで、以下のコマンドを実行。

> python -m venv rag

この後に、仮想環境を有効化するには、

> .\rag\Scripts\activate

と入力します。

で、まだこれだけでは足りなくて、C++のビルド環境を作ります。

以下のサイト、

Microsoft C++ Build Tools - Visual Studio

からVisual Studio Build Tools 2022のインストーラーをダウンロードします。
これを立ち上げると、「Visual Studio Build Tools 2022」ってやつの横に「変更」というボタンが出てきます。

20240520-230318

出てきたオプションの中から「C++によるデスクトップ開発」のみをチェックしてインストールを開始します。
ちょっと時間かかります(数GBのダウンロード)。

さらに以下を参考に、Windows版Gitをインストールしておきましょう。

Gitのインストール方法(Windows版) #Git - Qiita

Python環境構築

これでいよいよ、Pythonのライブラリを入れていきます。

まずは「torch」です。

今回使うのはCPU版なので、

> pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cpu

でインストールします。

それ以外のライブラリですが、メモアプリか何かで、

llama-index==0.9.13
transformers==4.35.2
llama_cpp_python==0.2.20

と描き込み、「requirements.txt」という名前で保存します。
これを使って、必要なライブラリをインストールします。

> pip install -r requirements.txt

ここでllama-cpp-pythonもインストールされます。Visual Studio Build Tools入れてないと、ここで止まりますので注意。

コードを入れておく作業フォルダを作っておきます。
とりあえずここでは、「elyza-rag」とします。

コマンドプロンプト上でこのフォルダに移動し、

> cd c:\linux\elyza-rag

モデルをダウンロードしておきます。

> git lfs clone https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-instruct-gguf/ --include "ELYZA-japanese-Llama-2-7b-instruct-q8_0.gguf"

ダウンロードが終わると「ELYZA-japanese-Llama-2-7b-instruct-gguf」という名前のフォルダができるので、「models」というフォルダを作って、その中にこれを入れておきます。

※ 【追記】その後、上のモデルを「ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.gguf 」に変えてみましたが、ほぼ同じ性能で2倍近く高速化します。これを落とすには、
> git lfs clone https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/ --include "ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.gguf"
と実行。以下、プログラムコード内のモデル名も修正してください。

文章ファイル準備

「RAG」というのは、独自の文章データを参照して、その中身について回答する仕組みです。
なので、独自文章データを用意しておきます。

data」というフォルダを作って、その中にUTF-8形式のテキストデータを入れておきます。

私の場合は、自作小説

計算士と空中戦艦 : 小説家になろう

からテキストダウンロードして、このdataフォルダに放り込んでおきました。全部で11万文字。

これで、ようやく準備完了です。

実行

では、いよいよ実行です。
と、その前に、実行させるプログラムコードがないですね。


import logging
import os
import sys

from llama_index import (
    LLMPredictor,
    PromptTemplate,
    ServiceContext,
    SimpleDirectoryReader,
    VectorStoreIndex,
)
from llama_index.callbacks import CallbackManager, LlamaDebugHandler
from llama_index.embeddings import HuggingFaceEmbedding
from llama_index.llms import LlamaCPP

# ログレベルの設定
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)

# ドキュメントの読み込み
documents = SimpleDirectoryReader("data").load_data()

# LLMのセットアップ
model_path = f"models/ELYZA-japanese-Llama-2-7b-instruct-gguf/ELYZA-japanese-Llama-2-7b-instruct-q8_0.gguf"
llm = LlamaCPP(
    model_path=model_path,
    temperature=0.1,
    model_kwargs={"n_ctx": 4096, "n_gpu_layers": 32},
)
llm_predictor = LLMPredictor(llm=llm)

# 埋め込みモデルの初期化
EMBEDDING_DEVICE = "cpu"
# 実行するモデルの指定とキャッシュフォルダの指定
embed_model_name = ("intfloat/multilingual-e5-large",)
cache_folder = "./sentence_transformers"
# 埋め込みモデルの作成
embed_model = HuggingFaceEmbedding(
    model_name="intfloat/multilingual-e5-large",
    cache_folder=cache_folder,
    device=EMBEDDING_DEVICE,
)

# ServiceContextのセットアップ
## debug用 Callback Managerのセットアップ
llama_debug = LlamaDebugHandler(print_trace_on_end=True)
callback_manager = CallbackManager([llama_debug])

service_context
= ServiceContext.from_defaults(
    llm_predictor=llm_predictor,
    embed_model=embed_model,
    chunk_size=500,
    chunk_overlap=20,
    callback_manager=callback_manager,
)

# インデックスの生成
index = VectorStoreIndex.from_documents(
    documents,
    service_context=service_context,
)

# 質問
temp = """
[INST]
<<SYS>>
以下の「コンテキスト情報」を元に「質問」に回答してください。
なお、コンテキスト情報に無い情報は回答に含めないでください。
また、コンテキスト情報から回答が導けない場合は「分かりません」と回答してください。
<</SYS>>
# コンテキスト情報
---------------------
{context_str}
---------------------

# 質問
{query_str}

[/INST]
"""

query_engine = index.as_query_engine(
    similarity_top_k=5, text_qa_template=PromptTemplate(temp)
)

while True:
    req_msg = input("\n## Question: ")
    if req_msg == "":
        continue
    res_msg = query_engine.query(req_msg)
    res_msg.source_nodes[0].text
    event_pairs = llama_debug.get_llm_inputs_outputs()
    print("\n## Answer: \n", str(res_msg).strip())

これを「elyza_rag.py」という名前で保存。

あとはこれを、

> python elyza_rag.py

と実行します。

一番最初の実行時にのみ、埋め込み用モデルのダウンロードが行われます。続いて、テキストファイルのベクトル化が行われ、だいたい10分ほどで「## Question:」とでて待機状態になります。

この後ろに、質問を入れます。

では、せっかくなので、この文章ファイルにしかない情報を質問してみました。

##Question: カルヒネン曹長の恩師の名前は?

20240520-230145

質問を入力してエンターキーを押した直後、なにやらずらずらと文章っぽいものが並んできます。デバッグデータが並んでいるようですが、これを見ても何のことやら、というところです。

で、この状態で待つこと数分。回答が返ってきました。

## Answer:
ラハナスト

いやまあ、正解なんですけど、なんだかそっけない答えです。

もう一つ、行きます。

## Question: キヴィネンマー要塞の司令官の名前は?

で、また数分後。

## Answer:
エクロース大佐

ちょっと惜しいなぁと思ったのが、正解は「エクロース准将」なんですよね。佐官では司令官にはなれませんから。
作中の昇進前の階級が出てきました。

とはいえ、確かに「data」フォルダ内の文章を参照し、回答していることが分かります。

ただし、回答されない場合や、目茶苦茶な答えが返ってくることがあります。そこは軽量な7b(70億パラメータ)モデルですからねぇ。

にしても質問されて答えが返ってくるまでに数分(5~8分)かかるのは、ちょっと実用的ではありません。
今回はCPUで動かしたため、こうなりましたが、CUDA対応torchとGPU版llama-cpp-pythonを導入し、そこそこのGPUがあれば、より実用的な速度で運用できるかと思います。さらに上の13bモデル辺りを使えば、より高精度な回答が作れそうです。

といっても、やっぱり小説を食わせたのがよくなかったのかな。
本来ならばビジネス文書、あるいはQ&A集のようなものを入れておき、チャットボット的に活用するのがいいかもしれません。

セキュアな環境で動かせるローカルLLMによるRAGを検討されている方なら、ぜひご参考まで。


AIビジネスチャンス 技術動向と事例に学ぶ新たな価値を生成する攻めの戦略(できるビジネス)

2024年4月25日 (木)

東京ビッグサイトへ行ってきました

Img_5010

何年ぶりですかね。確か、2019年以来な気がします。

Japan IT Week 春が行われるということで、東京ビッグサイトへ行ってきました。

Img_5003

乗った新幹線は、行きも帰りもN700Sでした。

Img_5004

そうそう、最近の新幹線は、この背もたれ倒しレバーの

Img_5005

その下にコンセントがついてるんですよね。このため、全座席にコンセントが設定されてます。

Img_5009

さて、今回は「ゆりかもめ」で行くことにしました。新橋が始発駅なので、東京から新橋に行って、そこから乗り込みます。

Img_5028

そういえば、新橋って日本で初めて鉄道が作られたときの駅じゃなかったでしたかね?
そういう背景があるからなのか、D51の車輪が飾られてました。

Img_5026

で、着きました、「東京ビッグサイト駅」
ゆりかもめって、なんかジグザグに移動する感じで、短い距離を何度も折れながら移動していたため、随分と遠回りをした感じがします。
ですが、着いてしまえばビッグサイトからもっとも近い駅です。

Img_5012

お目当てはこちら。AI自動化展、メタバースEXPO辺りが狙いでしたが、それ以外もちょくちょく見てました。

Img_5011

ちなみに、お隣ではこんなものが。
宇宙ビジネスに関する展示だそうです。
が、こちらは申し込んでいなかったため、入れませんでした。

Img_5017

その代わり「はやぶさ2」の実物大展示が表に置かれていて、こちらは撮影可だったので撮ってきました。

思いの外、大きいですね。

Img_5016

さて、ゲートの向こう側は撮影禁止なので、ここからは口頭で。

生成AIを用いたサービスが、とにかく多かったですね。ただ、それ単体を使うというわけではなく、これに社内文書やデータベースを参照させて社内の問い合わせ対応に使う(「RAG(ラグ)」と呼ばれてますね)、営業の社内教育用に様々なパターンの「お客」を演じてもらう、ソフト開発に使う、などなど。

そういえば、ドスパラを運営する「サードウェーブ」も展示してましたね。Meta Quest 3などのメタバース用端末として出店してましたが、なんかいろいろ端末が置いてあって思わず見とれてました。

UbuntuのCanonical社も出店してました。通常の無料版UbuntuだとLTS版でもサポートが5年で切れるところ、10年サポートがうけられるなど、有償版Ubuntuサービスを説明してました。

目新しいものは、あまりなかった感じですね。アプリ開発でちょっと面白そうなところがあったくらいでしょうか。

とにかく、客引きがすさまじかったですね。油断していると、関係なさそうなサービスのところで捕まります。
首から自身の会社やメアドの情報と紐づいたQRコードをぶら下げているので、それのスキャンを求められます。
今回はなるべく、無関係そうなところは突っ切りました。

Img_5031

という具合に、3時間ほどでほぼ行きたいところが回り終えたため、そのまま秋葉原へ。
改札を出たら、いつもとは逆の方に出ちゃいました。

Img_5033

まあ、いつものところを巡回してましたが、Raspberry Pi 5用のM.2 SSDが欲しかったので、安いのがないかと探してました。
が、あんまりよさげなものがなかったですね。PC用なら魅力的なものは多かったんですが。

Img_5039

当然、いつものようにBEEPにも寄りました。

Img_5036

X1 Turbo Zが置いてありました。いいですね、Turbo Z。ついに手に入れることはなかったハードです。

Img_5037

そういえば、オレンジを直に絞る自販機ってやつがBEEPへ降りていく階段の前に置かれてました。
結構なお値段ですが、売れてるんですかね?

Img_5034

16bitセンセーション Another Layerのアニメの聖地?もちゃんと撮影してきました。
ここって、かなり昔からこのままみたいですね。ちなみにこのミスド、ソフマップのビルの中に埋め込まれる形で存在してます。

Pxl_20240425_071130650

まあ、そんな具合に秋葉原も巡り、ちょっと早めに帰路につきます。
行きは雲で覆われていた富士山が、真っ白な山頂を現していました。

Img_5047

で、今回の戦利品です。

お土産は、東京ばななのお店でゲット。

Img_5048

この2冊は、BEEPで買ったものです。

Img_5051

秋葉原オタクスポットガイドというこの本は、結構マニアックなお店を紹介してました。
もちろん、BEEPもちゃっかり紹介されてます。

Img_5052

もう一冊のは、大戦略の開発秘話が書かれた同人誌のようです。
私、X1版の大戦略にそれこそドはまりしたので、その裏の話(98/88版ではありますが)が垣間見られるこの本に、興味津々です。

なんか最近、立て続けに東京出張がありましたが、今回もいろいろと収穫はあったので無駄ではなかったかなと。
が、そろそろ新しい情報も頭打ちになりつつある感じ。しばらく、間を置くことになりそうです。


特濃! あなたの知らない秋葉原オタクスポットガイド

2024年4月21日 (日)

簡単にローカル版大規模言語モデル(LLM)を導入できる「Ollama」

導入してとりあえず動かしてみるだけなら、確かに簡単でした。

このOllamaを使って、つい2日前(日本時間の4月19日)にリリースされたばかりのオープンソースAIであるLlama3を動かしてみました。
参考にしたのは、以下のサイト。

いちばんやさしいローカル LLM|ぬこぬこ

まずは、Windows版のOllamaをダウンロード、インストールします。
やり方は簡単で、下記サイトにアクセスし、

Download Ollama on Windows

20240421-150649

「Download for Windows (Preview)」をクリックして、Windows用のインストーラーをダウンロードします。

20240421-150753

こんな感じの可愛いアイコンが出てくるので、これをダブルクリック。

20240421-150807

Installをクリックします。

インストール完了後、Windows PowerShellかコマンドプロンプトを開き、

> ollama run llama3

と入力しエンターキー。

20240421-152220

5GBほどダウンロードが始まりますが、しばらくすると「Send a message」って出てきます。

ちなみに、デフォルトでは8Bモデルが入る模様。

まあせっかくなので、「お勧めの名古屋飯」でも聞いてみようと思いましたが、日本語だとうまく認識してくれませんでした。てことで、Google翻訳辺りを使ってぶち込んでみた。

【質問】

Please tell me your recommendations for food in Nagoya.
(おすすめの名古屋飯を教えてください)

【回答】

1. **Hitsumaboshi**: A classic Nagoya dish, Hitsumaboshi is a type of eel sushi made from grilled Japanese eel
(unagi). You can find it at many restaurants throughout the city.
2. **Tebasaki**: These are crispy fried chicken wings that are super popular in Nagoya. Try them at a street food
stall or a local eatery like Takayama Shokudo.
3. **Kakigori**: A traditional Japanese shaved ice dessert, Kakigori is flavored with syrups like strawberry,
green tea, and yuzu. Enjoy it on a hot day!
4. **Soba noodles**: Nagoya is famous for its soba (buckwheat) noodles, which are often served in a hot broth or
with dipping sauce. Try them at Soba no Hana or Nishinokyo Ichinojo.
5. **Miso katsu**: A variation of tonkatsu (breaded and fried pork cutlet), Miso katsu is a Nagoya specialty that
combines the crispy exterior with a rich miso sauce. Enjoy it at restaurants like Miso Katsu Shinji or Tonkatsu
Maisen Aoyama Honten.
6. **Tofu**: As a city known for its tofu production, Nagoya has many delicious tofu dishes to offer. Try the
grilled tofu (yuba) at Tofuya Fujita or the soft and silky tofu hot pot at Akabane Tofu.
7. **Katsu curry**: Another popular dish in Nagoya, Katsu Curry is a breaded and fried cutlet served with a
flavorful Indian-inspired curry sauce. Enjoy it at restaurants like Curry Katsu Ichinojo or Katsu Curry Shinji.
8. **Goyan**: A type of Japanese rice ball, Goyan is often filled with ingredients like seafood, vegetables, and
meat. Try it at a local bakery or convenience store.

Some recommended eateries and districts to explore:

* Nakamuraza: A historic district known for its traditional restaurants and shops.
* Nishinokyo Ichinojo: A small alleyway filled with local eateries and food stalls.
* Osu Shopping Street: A bustling shopping street lined with restaurants, cafes, and snack stands.
* Hisaya-odori: A popular shopping district with many food options, including the famous Hitsumaboshi eel sushi.

Remember to also try some of the local specialties like sesame tofu, Nagoya-style ramen, or Japanese sweets
(wagashi) at traditional tea shops. Enjoy your culinary adventure in Nagoya!

うちの環境(Ryzen 5 4600H、64GBメモリー、GTX1650Ti)だと、応答はじめまで10秒、書き上げるのに1分程度でした。
思いの外、回答が長くて驚愕。

さて、この言語モデルが「おすすめの名古屋飯」に対してあげたのは、1.ひつまぶし、2.手羽先、3.かき氷、4.ざるそば、5.味噌カツ、6.豆腐、7.カツカレー でした。
が、最後の8.Goyan だけが何のことだか分からず。後ろの説明文(英文)を読むと、おにぎりの一種で、シーフードや野菜、肉を挟んだものらしい。天むすじゃないな、どちらかと言うと韓国海苔巻きの「キンパ」の方が近いか?

その下にある食事処の紹介も、1つ目が「中村座」、2つ目が「西ノ京 いちのじょう」と、名古屋にあるとは思えない名前の場所。3つ目は「大須商店街」、4つ目「久屋大通」は分かるんですけどね。

まあ、それでもこれだけ軽いモデルで、これだけの回答が得られたことに驚きです。しかも、こんな日本のへき地?の情報までそれなりに持っているとは。

なお、終わる時は「/bye」と入力します。

上の参照元のサイトでは、ブラウザからChatGPT感覚で入力できるUIの起動や、量子化による軽量化のやり方も紹介されてます。私は面倒だったので、動いたところで終わりました。

ともかく、出たばかりのLlama3がこれほどあっさりと試せるということに驚きです。Pytorchの最新版とかいちいち入れてませんし。
さすがにCUDAの設定までは必要でしょうが、Pythonすらインストール不要で動かせるっぽいのはなかなかです。
このLlama3ベースの日本語特化モデルが出てきたら、これで動かせるといいなぁ。


ChatGPTなどの生成AIを実現した LLM(大規模言語モデル)超入門!: AI時代を理解するために知っておきたい 大規模言語モデル 初心者向け解説書 超入門! シリーズ

2023年12月31日 (日)

2023年まとめ記事

とうとう、まとめ記事を上げる日がやってきました。
今年も、いろいろとありましたね。振り返っていきましょう。

【1月】

リモート会議用スピーカーマイク EMEET Luna Liteを買った: EeePCの軌跡 

まだ1月って、コロナの影響が残っている時期でしたね。といっても、リモート会議から面着へと移行しつつあるというこの時期に、こんなものを買いました。
このスピーカーマイクですが、これ、見た目はちょっと微妙ながらも結構重宝しております。今年一番の買ってよかったアイテムではなかったでしょうか。

【2月】

Nikon COOLPIX B500の最大望遠(40倍)で月を撮ってみた: EeePCの軌跡

そういえば、これを買ったのも今年でしたね。
Nikonの40倍望遠カメラ「COOLPIX B500」で、月を撮影してみたという記事です。
このカメラ、40倍という望遠に惹かれて購入したんですが、それ以外にも単三電池に対応、レンズ交換不要などなど、意外と利便性が高いカメラで重宝してます。子供の運動会撮影でも活躍しました。

【3月】

PCコンフルで中古PCを買ってみた: EeePCの軌跡

この月もいろいろとやってますが、次男用に中古PCを買いましたね。
1.8万円でしたが、これでメモリー8GB、SSDも128GB入ってて、そこそこの速度で動く。辛うじて動画編集もできます。
いうほど使ってませんけど、ちょくちょく使っています。
メインPC側で読めなかったDVD-Rを読み込めたのは、なかなかのクリーンヒットでしたね。それだけでも買った価値はありました。

【4月】

64GBメモリー(32GB×2)にしてみた等: EeePCの軌跡

4月ぐらいから、オープンソースな生成AIを試すことが増えました。そのきっかけがこの記事。
メインPCであるGALLERIA GR1650TGF-Tのメモリーを、16GB → 64GBまで一気に増やしました。
半導体不足と言われる中、メモリーの価格は下がっていたんですよね。
モデルが配布されている生成AIを使おうとすると、どうしても64GB以上のメモリーが必要となるため、思い切って増やしたんですが、その後、

無料で商用利用可能でわりと賢い?生成系AI「Dolly 2.0」を試してみた: EeePCの軌跡

という記事などで、これ以降は生成AI、特にLLM(大規模言語モデル)をいくつも試すことになります。
結果として、いい決断でした。

【5月】

りんなチャットAI「rinna japanese-gpt-neox-3.6b」と楽しく??会話してみたら……: EeePCの軌跡

で、64GBメモリーを手に入れてすぐに、そこそこ使えるAIが登場です。rinna-GPTと言われるこいつは、個人PC上で動く生成AIながら、わりと自然な会話を返してくれるという驚異の生成AIモデルです。

メインPCのストレージをキオクシア製2TB NVMe M.2 SSDにしてみた: EeePCの軌跡

この生成AIのおかげで、SSDまで強化する羽目になりました。
振り返ってみると、今年は意外とPCへの投資が多い年でしたね。

【6月】

完璧で究極の(!?)大容量バッテリー「JVC BN-RB10」を買った: EeePCの軌跡

タイトルはちょっとあの曲の影響を受けちゃってますが・・・そういえば、非常用のどでかいバッテリーを買いましたね。
容量は1002Wh、最大出力は1000Wという、化け物級のモバイルバッテリーです。
クーラーすらも動かせるという、なかなかのバッテリー。普段の使い道はないかなと思いきや、意外と在宅勤務時に使っております。

東京出張ついでに秋葉原 & 靖国神社へ行ってきました: EeePCの軌跡

そういえば、泊り出張も久しぶりにしました。
品質工学会へ参加したんですが、出発時には記録的な大雨に見舞われ、アキバにも行き、Surface Goが活躍し、さらに靖国神社へ行くなど、密度の高い2日間でしたよね。

【7月】

MT法で音声の異常検知をやってみた: EeePCの軌跡

そんな泊り出張の成果が表れた記事がこちらです。MT法を使えるプログラム。
製造現場であれば誰もが必要とするであろう、異常検知な仕組みを提供するプログラム、とでも言えばいいでしょうか。
ちょっとマニアックなコードですが、まあまあ役に立っております。

ユニバーサルスタジオジャパン(USJ)へ行ってきました: EeePCの軌跡

そういえば、大阪にも行きましたね。USJへ行ってきました。
まあ、それなりに楽しんできましたが、スーパーニンテンドーワールドへは近づくことすらできませんでした。
この時、長年使われてきた新幹線内の車内チャイム「Ambitious Japan」が「会いに行こう」に変わってました。
ちなみにこの時、40倍カメラとモバイルバッテリーが大活躍しました。

【8月】

 中古で買ったPS4でゲームを始めるのに一晩かかりました: EeePCの軌跡

そういえば、PS4を買ったんですよね。
動機としては、グランツーリスモ7をやりたかったからなんですが、今ではこのPS4、YouTube再生機と化してます。

ホリエモンのChatGPT本を買ってみた: EeePCの軌跡

今年はなんと言っても生成AIが盛り上がった年ですが、その勢いでホリエモンのChatGPT本を買いました。
結構参考になる本です。こんな使い方があるんだなぁと、いろいろと気づきを得た本です。
といっても、言うほどChatGPTは使ってませんね。プログラミングではかなりお世話になってますが、それ以外ではやっぱりちょっと使い辛い。
そんなわけで私は、カスタマイズ可能なオープンソースな生成AIをいろいろと試してます。

【9月】

わけありSurface Go 3 LTEを6万で購入、イオンモバイルにつないでみた: EeePCの軌跡

この月はやはり、この「わけありSurface Go 3」の購入が最大の買い物でしたね。
お値段は約6万円、法人向け、メモリー4GB、だけどLTE搭載という、すごいんだかすごくないんだか分からない微妙過ぎる機種です。
まあでも、通信回線を内蔵って魅力的ですよね。使い切れてませんけど。
来年あたりには、活躍の機会を与えていきたいと思います。

【10月】

CIOの45W小型2口充電器を購入: EeePCの軌跡

5月の解除宣言以来、出張が増えました。
その結果、USB電源が重宝するようになりました。なにせiPhoneの充電だけでなく、ノートPCも今やUSB電源で動く時代となりましたので。
45Wという出力でありながら、この小ささは重宝しております。
なお、このCIOというメーカーの30W 10000mAhのバッテリーも買いましたね。最近、個人的には注目しているメーカーです。

小説家になろう「第11回ネット小説大賞」一次選考に11作品が通過: EeePCの軌跡

小説家になろうにて行われているネット小説大賞で、なんと11作品も1次選考を通過しました。これはなかなかの快挙。
もっとも、2次選考は一つも通らなかったんですが・・・うう、悲しい。

人生初、幕張メッセに行ってきた: EeePCの軌跡

そういえば、幕張メッセに行ってきました。展示会目当てでしたが、それなりに収穫のあった出張でした。
個人的にはRaspberry Pi 5の実物を見られたのがよかったかなぁと。出たらすぐに買うつもりです。
もちろん、秋葉原にも忘れずに行ってきました。6月と同様、密度の高い出張でした。

【11月】

Calm2-7B-Chatを完全オフラインで使う: EeePCの軌跡

今年のオープンソース生成AIでは、これが一番のヒットでした。
Calm2-7B‐Chatというモデルですが、ChatGPT並みとはいかないものの、オフラインで使えて文書要約、プログラム作成など、オープンソース系としてはかなり幅広い活用法を持つモデルです。
実は最近、これを社内で使う機会がありました。かなり癖はあるものの、使いこなせばまあまあ使える生成AIですね。

16インチのモバイルモニター買った: EeePCの軌跡

モバイルモニターなるものを購入。理由は、23インチモニターを処分したかったから。
このモニターのおかげで、USB-Cにもいろいろな種類があることを思い知らされましたね。

【12月】

日経Linux最後の号を購入: EeePCの軌跡

DOS/V Power Report誌の最終号を購入: EeePCの軌跡

この月は休刊が相次ぎました。あまり読んでいない雑誌ならばともかく、わりと購入していた雑誌が続けて3誌も休刊したので、寂しい限りです。
紙の本にもまだ役割はあると思うんですが、しばらくはこうした淘汰が進むんでしょうかね。

EPSON製プリンター「EW-052A」を購入: EeePCの軌跡

年の瀬にやっと複合プリンターを買いました。今度はEPSON製です。
ちょっと不満なところもないこともないですが、小さいですし、印刷開始までが早いですし、しかも印刷品質も上々。ちょっと付き合ってみます。

ChatGPT 3.5並みの日本語能力を持つとされるLLM「ELYZA-japanese-Llama-2-13b-instruct」を使ってみた: EeePCの軌跡

さて、今年最後に出会ったLLM(大規模言語モデル)ですが、もしかするとこれが最強なのでは?と手ごたえを感じているところ。ただこのELYZA-13b、ちょっと文字数制限があるのが残念なところ(うちの環境では、文字数を増やしたらメモリー不足で落ちました)。
でも、来年に向けてはこの辺りの技術の発達に、大いなる希望を感じます。

とまあ、今年もいろいろと買いましたね。買うばかりではなく、新しいことにも手を付けてます。特に、LLM辺りにご執心なところもありました。
とはいえ、やはり物欲馬鹿なので、結局なんやかんやと購入してます。そもそも、このブログが「物欲購入記」なわけですし。
今年はコロナ禍も明けて、徐々に行動範囲が戻りつつありました。来年はさらなる行動の年になるかなと思ってます。いろいろと知識や情報を吸収していきたい。買い物もしたい。そういう気分です。

ということで、今年はこれが最後の更新となります。

皆さま、良いお年を。


会社四季報 2024年1集 新春号

より以前の記事一覧

無料ブログはココログ

スポンサード リンク

ブログ村