« 2026年8月 | トップページ | 2026年10月 »

2026年9月26日 (土)

オーディオテクニカ製のワイヤレスイヤホン購入

以前から、もう一組欲しいなぁとは思っていたので、ワイヤレスイヤホンを買いました。

20260925_095956486_ios

買ったのは、オーディオテクニカ製ATH-CKTWというやつ。お値段はだいたい7千円弱。
こいつを選んだ理由は、あまり大したものじゃなくて、

・ エディオンのポイントが五千ほどあった
・ そういえば最近、オーディオテクニカ製の製品、買ってないなぁ・・・

というものです。

20260925_100100308_ios

中身は、こんな感じ。本体ケース+イヤホン、取説、ケーブル、そしてカナル式定番の耳に突っ込むやつのサイズ違い。
ちなみに、私の耳では一番デカいやつでちょうどいいくらいでした。正直、それでもちょっと足りないほど。
なお、ケースの裏には製造元に「鐵三角有限公司」と書かれてました。ぶっちゃけ、中華製です。

20260925_115351608_ios

さて、我が家には今、三つのワイヤレスイヤホンがあります。これを比べてみましょうかね。

20260925_120124249_ios

ちなみに、つないだのはPixel 9aです。

20260925_120332041_ios

で、この同じ曲を聞いて三者を聞き比べ。なお、NAGAOKA製とこのオーディオテクニカ製のやつはPixel 9aで、AirPods 4はiPhone 15 Plusを使うしかないので、その点はご留意を。

20260925_121722110_ios

聞き比べた感じを現すと、こんな感じ。
やっぱり、圧倒的にAirPodsの音の方がいい。クリアで、重みがあり、左右のバランスも良し。

4千円未満で買ったNAGAOKA製のイヤホンと比べると倍くらいの価格だった今回のこのイヤホンですが、正直、聞き比べた結果は倍の値段並みとは言い難い感じでした。

良いところを先に書くと、NAGAOKA製に比べたら音はクリア。高音から低音まで、バランスは良いです。こもり感もなし。
あと、NAGAOKA製はUSB-C to USB-Aのケーブルでしか充電できませんが、このATH-CKTWは普通のUSB-Cケーブルで充電できます。
まあ、当たり前のことなんですけどね。
あと、若干のノイズキャンセリングがあるのか、周囲のノイズが若干、弱められてる感じでした。耳を塞ぐカナル式同士の比較でも、それは感じました。逆に言えば、AirPodsはそこが弱いですね。隙間だらけなので。

さて、悪いところを書きましょうか。

まず気になったのは、左右のはめ心地が異なること。左はぴったり耳に収まるんですが、右はどう頑張ってもなんか少し浮いてる感じでした。
一番デカい耳穴のキャップを使っても、それです。
いろいろなイヤホンを買いましたが、ここまで左右差を感じたのは初めて。おかげで若干、右側の音が弱い。

あと、ワイヤレスイヤホンというのは、外したら音楽が自動で止まるものだと思ってました。実際、安いNAGAOKA製でも止まります
が、こいつは耳から離しても、音が鳴りっぱなしです。ただ、ケース内に入れたら接続が切れて、音が止まります。
細かいことですが、ちょっとそこは気になりました。

これは良し悪しですが、イヤホン本体についたボタンが異様にデカい。幅があるので、耳にはめようとしてると触れてしまうことがあります。
すると、音楽が止まってしまいます。もっとも、押せばすぐに復帰するので、そこまで気にはならないんですが、意図せずぶちっと切れるのはちょっと気に障るところ。

正直、ちょっと値段の割にはいまいちなワイヤレスイヤホンでした。

外観の質感は良いので、そこは良いんですけどね。あと、電車内で使うとどうなるか?
NAGAOKA製の安いやつは、周囲にBluetooth接続が飛び交う環境下では、比較的切れやすい方でした。これは安いワイヤレスイヤホンほど、その傾向があります。
そういう環境下での接続強さはどうなのか?
こればかりは、出張時などに試すほかないので、今度試してみます。

ちょっと左右差だけが気になりますね。とはいえ、わりと片耳で使うことが多いので、それほど気にはならないかもしれませんが。
なお、NAGAOKA製のは、先日買ったmoto g37j用にしました。これで三台の端末でそれぞれ、ワイヤレスイヤホンを使うことができます。

そういえば、AQUOS wish 5をどうしようかなと。
最近は電源を落としたままなので、こいつの使い道も考えてやらないといけませんね。


オーディオテクニカ ATH-CK1TW BK ワイヤレスイヤホン bluetooth/完全ワイヤレスイヤホン / 最大約21時間再生 / 通話品質強化 / IPX5/7 / 低遅延モード/片耳使用可 【国内正規品】 ブラック ATH-CK1TW BK

2026年9月19日 (土)

moto g37jを一週間使ってみてのレビュー

先週土曜日に届いた、3万円台のAndroid端末「moto g37j」ですが、ちょうど一週間経ったので、レビューです。

まずは、バッテリーのもちがすこぶるいい。
新品ということもありますが、かなり動画をたくさん見てもなかなか減りません。新品の頃のiPhone 15 Plusのようでした。
今期は私にとって珍しくアニメの当たり期で、ほぼ毎日3~4本ほどアニメを見てますが、それにYouTube動画、「上海」というゲームをガンガンやりましたけど、土曜から日曜にかけて1日半はもちました。

なお、5200mAhというバッテリー容量だそうですが、これは我が家で最大級クラス。薄い筐体なのに、結構入ってます。

そういえば前回の記事で「ラジオ搭載と書いてあるのにアプリが見当たらない」的なことを書きましたが、あれは間違いでした。

Img_6949

ちゃんとありました、FMラジオ。ただし、何かのフォルダ内にあって見つけられなかった、というだけでした。

Img_6950

こんな具合に、有線のイヤホンをつないでやれば受信できます。
このままイヤホンからも聞けますが、内蔵スピーカーやBluetoothスピーカーで聞くことも可能。

Pxl_20260916_054807028macro_focusmp

さて、スマホを使う時に、こんな感じに小指で支えることが多いんですが。

Pxl_20260916_054824403

こいつの場合、カメラ部分のケースのこのでっぱりのおかげで、人差し指でもある程度、支えられます。
これはちょっとだけ、ありがたい話。いつも小指が痛いですからね。

後はいたって普通のAndroidです。変なUIもないし、ごく普通に使えます。暑くなることもほとんどなし。
AQUOS wish 5の方がその点、変なインターフェースです。画面を上にスライドすると、普通のAndroidなら全アプリの一覧が出てくるところですが、wish 5はドコモ版SmartNewsが起動します。普通のAndroidインターフェースにできません(元がドコモ版だからでしょうが・・・そういう独自カスタマイズは誰も求めてないから、いい加減やめてほしい)。

ただ、変なプリインストールが入ってるというのは、前回の記事でも書いた通り。消してしまえば、問題ありませんが。

ちなみに、やけに中華ゲームアプリが入ってると思ったら、モトローラ社って今、中国資本の会社なんですね。
だからなのかぁと、妙に納得しました。

ところでこのmoto g37jの画面なんですが、安いAndroidらしく?TFT液晶を採用してます。
で、6.72インチのこの画面の解像度はというと、2400×1080の390ppi。
手持ちの機種の比較で言うと、iPhone 15 Plusが6.7インチ、2796×1290の460ppi、Pixel 9aが6.2インチ、2424×1080の422dpi。こちらはいずれも有機EL。
ちなみにAQUOS Wish 5は、6.6インチで1620×720のTFT液晶、267ppi。

とまあ、解像度比較で言うと、Wish 5ほどではないにせよ、お値段高めの2機種と比べたらさほどいい画面というわけではないんです。

が・・・不思議なことに、文字やアイコンの輪郭がやけにくっきりと見えるんですよね。
iPhone 15 Plusはフィルム貼ってるのでほんの少しぼやけても仕方がないんですが、Pixel 9aはフィルムを貼ってないのに、なんだか文字やアイコンの輪郭がg37jと比べると少し、ぼやけて見える。
気になるほどではないんですが、ふとg37jの方がくっきり見えるなぁ、と思うことがありますね。

もしかすると、こういうのは経時劣化する可能性もあるので一概には言えませんが、ともかく液晶画面の癖に?やけにいい感じです。
ついでに黒色も、有機ELに劣ってる感じがしません。これは、写真ではうまく表現できませんが、見比べてて「液晶」だと思うことはあまりないですね。
黒色の深さが有機ELの強みの一つなのに、スマホサイズですと最近それほど差があるようには感じませんね。
意外にも、不思議と画面の良さが光る端末です。今のところ。

という感じで、使い勝手は悪くないですね。同じ中華製の折り畳みのZTE Libero Flipに比べたら、全然いい感じです。
長い付き合いになりそうかな。そんな感じの端末でした。


Motorola(モトローラ) moto g37j PANTONE|4GB/128GB|インペネトラブルグレイ|PBCK0000JP

 

2026年9月16日 (水)

起動時に「Microsoft OneDrive Sync Service」がCPUパワー使いまくりの爆走状態になった時の対処法

なぜだか分かりませんが、ある時突然、メインPCであるASUS TUF THE GAMING A15が、起動直後に強烈にファンが回るようになりまして。
てっきり、冷却ファンにゴミでも詰まったのかなと思いつつもタスクマネージャーを見ると、なんとCPUが80%で走り続けてました。

20260916-071910

こんな状態です。

で、調べてみると、「Microsoft OneDrive Sync Service」というやつが、悪さをしていることが判明。

20260916-071851

だいたいCPUパワーの60~80%ほどを、こいつ一つが占めていることが分かりました。
起動してだいたい10分程度で収まるんですが、その際のファンの音がすさまじい。
まるでダイソンの掃除機のような音を立ててくれます。ごみを吸う必要のない、ただ一つの掃除機・・・なわけあるかい!
ということで、困ってしまいました。

これがOneDriveを使っていないのなら、タスクマネージャーから切ってしまうという手があるんですが、我が家の場合はMicrosoft 365 Personalで写真などのバックアップをしているため、おいそれとは切れません。

ということで、こうなった場合の対処法を調べてみたら、OneDriveのキャッシュクリアが有効とのこと。

で、公式サイトを参考にしたんですが、

OneDrive をリセットする | Microsoft Support

まずWinキー+Rで「ファイル名を指定して実行」を選び、下記の3つのいずれかを実行すればいいとのこと。

・ %localappdata%\Microsoft\OneDrive\onedrive.exe /reset
・ C:\Program Files\Microsoft OneDrive\onedrive.exe /reset
・ C:\Program Files (x86)\Microsoft OneDrive\onedrive.exe /reset

・・・だったんですが、まず1番目と3番目はうちの場合ダメでした。
で、2番目もそのままではダメで、「"C:\Program Files\Microsoft OneDrive\onedrive.exe" /reset 」とダブルコーテーション(")でくくってやらないとダメでした。そりゃそうですね、「Program Files 」にスペースが開いてるので、そのままでは実行できません。

公式ページなのに、そこはしっかり書いてくれよ、と思いましたね。

とまあ、そんなことはありましたが、まずはタスクマネージャーのスタートアップで「OneDrive」を無効化しておきます。

20260916-072639

再起動してから、Winキー+Rを押して「"C:\Program Files\Microsoft OneDrive\onedrive.exe" /reset」を実行。

20260916-073139

こんな画面が出て、キャッシュクリアが始まりました。
この直後に、タスクマネージャーのスタートアップのOneDriveを有効に戻しておきます。
で、最初は件数がどんどん増えていくんですが、うちでは6万件を超えた辺りで減り始めました。これが0になると終了、ということのようです。

・・・なんですが、めちゃくちゃ時間がかかりました。6万個以上もファイルがあったのがいけないのか、結果として5時間ほどかかりましたね。

Pxl_20260915_231845493mp

その間、時々、処理が止まったような感じ(いつまでたっても件数が減らない)になったため、2度ほど再起動しました。再起動後は勢いよく減ります。

が、何とか終わり、再起動するとあの「ダイソン・ファン」状態がなくなり、どうにか直りました。

にしても、どうしてキャッシュクリアすると直るのか、理屈がいまいちわかりません。変な現象です。

同様の現象を抱えている方は、お試しを。


【自動更新】Microsoft 365 Personal AI機能搭載 1年版 サブスクリプション | Win/Mac/iPad|インストール台数無制限(同時使用可能台数5台)

2026年9月12日 (土)

モトローラ製スマホ”moto g37j”を買いました

先日、9月10日に行われたAppleの発表をみて、

「こりゃだめだ」

となったので、

20260912_033221541_ios

モトローラ製のAndroidを買ってみました。
「Appleの発表を見ていたら、Androidを買っちまったんだ・・・何を言っているのか分からねえと思うが、俺にもわからねえ・・・」
とは申しません。
単に、iPhoneとは距離を置かないとダメだと確信し始めた、ということです。
それにしても目玉だったiPhone Duoですが、いくら折り畳みスマホとはいえMacBook Proより高いのはさすがにダメでしょう。今のAppleは正直言って、経営センスが無茶苦茶です。
円安、半導体高騰があるのは承知してますが、MacBook Neoの時に見せてくれた「男気」というやつが今回はまったく感じられなかったので、ちょっとがっかりです。

そんなわけで衝動買いしたこのmoto g37jですが、お値段はタイムセール中ということもあり、かつ色が不人気?だったのか、31,600円ほどで購入できました。
ええ、iPhone Duoの十分の一以下のお値段です。

20260912_033341477_ios

中身はこれだけ。本体と、薄っぺらい取説のみ。ケーブルすらありません。割り切ってますねぇ。

20260912_033403002_ios

ちなみにこの本体、最初からケース付です。もちろん外せますが、せっかくなんでつけておこうかと思ってます。

20260912_033438859_ios

で、早速起動。未だかつてないほど派手な起動画面です。
そういえば、モトローラ製の製品って買ったことないですね。今、うちにあるモトローラ製のものといえば、せいぜいMacintosh Plusに搭載されているCPUの68000くらいでしょうか。

Pxl_20260912_033547298

起動中の画面のままですが、moto g37j、AQUOS wish5、iPhone 15 Plusを並べて比べてみました。
ほぼ同じ大きさです。個人的には、この6インチサイズが一番使い勝手がいいかなと。

Pxl_20260912_034135427

ちなみに本体は、wish5よりもちょっと薄い感じ。
なお、moto g37jは下面にイヤホンジャックが付いてます。

Pxl_20260912_034153402macro_focus

もっとも、上の方にはカメラの出っ張りがあるので、あまり薄さは感じませんが・・・
ちなみにこの四つのカメラっぽいもの。左上がメインの5000万画素、その下が広角800万画素、で、右上がフラッシュですが・・・右下はどうやら、ダミーなようです。ちなみに画面側のインカメラは3200万画素とのこと。
しかし、何のためのダミーなのやら。そんなところで見栄を張ってもしょうがないのに。それとも、上位機種と本体を合わせるためにそうなっただけ?事情は分かりません。

20260912_033814964_ios

で、本体の配列はwish5を踏襲することにしました。ご覧の通り、コピーさせてたんですが・・・3時間かかると出て、途中でやめました。

20260912_045136110_ios

無論、アップデートはまず最初にやるべきこと。すぐにシステムアップデートしておきました。ちなみに、Android 16の模様。

20260912_050436742_ios

それから1時間ほどかけて、ようやく様々なアプリ設定も終わったところ。

さて、使ってみましたが、お値段がiPhone Duoの十分の一以下だというのに、とても快適です。
考えてみれば、私はほぼXかブラウザ、Geminiに動画系アプリを使うだけなので、今どきローレンジな機種でも困ることはほとんどないですね。

ちょっと使ってみての所感。

・ 音はwish5よりは断然いい
 ステレオサウンドは、iPhone 15といい勝負かも。

・ キャリア系未使用品ではないので、無駄なアプリやサービスがほとんど入ってない
 ただし、明らかに中華系のゲームのセットがあったので、丸ごと無効化しました(セットアップ時にもインストールさせられるところでした)。要注意。

・ カメラは・・・まあ、可もなく不可もなく、という感じです(下にメインカメラによる写真)

Img_20260912_141603099

明るいところならば、まあこんなものでしょう。いたって普通です。

なお、SDメモリーカードが使えます。最大1TBまで対応とのこと。
ただ、スマホに乗せたSDカードって、結構読み込み遅くてイライラするんですよね。あまり意味がない機能となりつつあります。

また、購入時の謳い文句に「FMラジオ搭載」と書いてあったはずなんですが、それっぽいアプリは見当たりませんでした。radicoすら入ってません。

という具合に、ちょっと似非臭いスマホですが、3万円という価格を考えればこんなものかなと。
ちなみに、NFC/Ferica搭載なので、交通系ICの残高を読めたりします。

最近、スマホがちょっと、高くなりすぎですよね。
そこまで高性能なスマホなんて、よほどのゲーム好きか、よほどローカルでAIでも使わない限りは不要な気がします。いや、ローカルAIはPCでやりましょう。スマホではバッテリーを食うばかりですし。

しばらく使ってみて、家族に流す予定。こうなったら家じゅうをAndroidで染めてやりますか。


Motorola(モトローラ) moto g37j PANTONE|4GB/128GB|フューシャレッド|PBCK0003JP

2026年9月11日 (金)

Gemma4 E4Bをファインチューニングしてみた

いやはや、大変でした。
Geminiを使ってバイブコーディングすればすぐにできると思いきや、学習に使うデータのフォーマット形式を間違えていたり、学習が進まなかったり・・・というのを乗り越えて、やっとこさ流れるようにはなりました。

今回、Gemma4をベースモデルとして、そこに新たな文書ファイルを学習させるという、いわゆる「ファインチューニング」というやつをやってみました。
社内文書などを参照しながら回答する「RAG」という手法もありますが、あれに比べるとモデルそのものに文章を埋め込んでしまうので、社内文章専用生成AIを作りたい、という方なら、まずはこのファインチューニングというのが検討対象になろうかと思います。

コードは生成AIにあらかた作らせたとはいえ、そのままでは無理でした。そこで、参考にしたのは以下のサイト。

Hugging Face Transformers と QLoRA を使用して Gemma をファインチューニングしてビジョン タスクを実行する  |  Google AI for Developers

ここを見てある程度、どんな処理をしているかなどを知ってようやく学習が進むようになりましたね。

やり方を書く前に、まず前提から。
我が家はRTX4060Laptop(VRAM:8GB)で、メインメモリー64GBのRyzen 5マシンです。
CUDAのバージョンは13.0、Pytorchは2.12.1、ちなみにPythonは3.11を使ってます。
Pytorchのインストール方法は、以下を参照。

Previous PyTorch Versions

ちなみに、ライブラリはPytorchを除くと、
$ pip install transformers datasets peft bitsandbytes trl accelerate
あたりを入れております。

なお、今回のファインチューニングとは、Gemma4の一部を書き換える「LoRA」と呼ばれる手法を使ってます。その中で特に量子化しつつパラメータ変更を行うものを「QLoRA」と呼ぶようです。これならば、少ないVRAM搭載のGPUボードでもファインチューニングが可能となったわけです。
今回はこの「QLora」をやりました。
その際には、「unsloth」というライブラリを使うことが多いようですが、以下の理由で導入してません。
・ unslothは少ないVRAMでも高速に学習が進むライブラリながら、モデルがVRAMに収まりきらないと学習が止まる
・ 多少低速になっても構わないので、メインメモリーの一部をVRAMとして学習に使うためには、unslothはむしろ不要
解釈が間違ってるかもしれませんが、確かにunslothを使わなくなったらメモリー不足のエラーが出なくなり、学習が進むようになりました。
ということで、ここではunslothを使わずに進めました。

ここからは、そのファインチューニング手順を書いていきます。

(1)データの準備

Gemma4の場合は、以下のようなjsonファイルとする必要があります。


{"messages": [{"role": "system", "content": "あなたは優秀な自動車販売員です。"},{"role": "user", "content": "新型「ガソリーナ」のコンセプトは何ですか?"}, {"role": "assistant", "content": "「走る歓びと環境性能の極限での融合」をコンセプトに開発された、次世代フラッグシップ・スポーツセダンです。"}]}
{"messages": [{"role": "user", "content": "「ガソリーナ」という名前の由来は何ですか?"}, {"role": "assistant", "content": "情熱的な走りの原点である「ガソリン(Gasoline)」へのリスペクトと、ラテン語の力強さを組み合わせた造語です。"}]}
{"messages": [{"role": "user", "content": "ガソリーナの発売日はいつですか?"}, {"role": "assistant", "content": "2027年春の発売を予定しております。"}]}
{"messages": [{"role": "user", "content": "車両本体価格はいくらですか?"}, {"role": "assistant", "content": "ベースグレードが4,500,000円(税込)、最上位エディションが6,800,000円(税込)となります。"}]}
{"messages": [{"role": "user", "content": "ガソリーナの主要ターゲット層は誰ですか?"}, {"role": "assistant", "content": "先進的なデザインと高い走行性能、そして環境負荷の少なさを同時に求めるプレミアム志向のドライバーです。"}]}
・・・

これを「text」というフォルダを作り、その中に「gasolina_faq_100_messages.json」という名で保存しました。

ところで、ここでは学習用に、Geminiを使って「ガソリーナ」という架空の車が新発売となることを想定した100問の想定質問集を作らせて、それを学習データとしてます。

(2)モデルダウンロード

以下のサイトから、モデルをすべてダウンロードします。それを「models」というフォルダに入れます。

google/gemma-4-E4B · Hugging Face

20260909-155619

ここの「Files and Versions」にある8個のファイル、全てです。特に「model.safetensors」は15GB以上あるので、ご注意ください。
なお、Hugging Faceにログインした状態でないと、この一番大きなモデルをダウンロードできませんでした。

ところで、Gemma4からは商用利用可能となったため、ファインチューニング用に重宝されている模様です(gemma3までは商用利用不可だったそうで)。

(3)学習用コード

以下のコードを「train.py」として保存します。


import os
import glob
import torch
from datasets import load_dataset
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
BitsAndBytesConfig,
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer, SFTConfig

 

def main():
base_model_path = "./models/gemma-4-E4B"
output_dir = "./lora_model"
text_dir = "./text"

 

# 1. データセットの読み込み
json_files = glob.glob(os.path.join(text_dir, "*.json")) + glob.glob(os.path.join(text_dir, "*.jsonl"))
if not json_files:
raise FileNotFoundError(f"'{text_dir}' フォルダ内にJSONファイルが見つかりませんでした。")

raw_dataset = load_dataset("json", data_files=json_files, split="train")

 

# 2. Tokenizer と Chat Template 設定
tokenizer = AutoTokenizer.from_pretrained(base_model_path)

gemma_chat_template = (
"{% for message in messages %}"
"{{'' + message['role'] + '\n' + message['content'] | trim + '\n'}}"
"{% endfor %}"
"{% if add_generation_prompt %}"
"{{'model\n'}}"
"{% endif %}"
)
if tokenizer.chat_template is None:
tokenizer.chat_template = gemma_chat_template

 

tokenizer.padding_side = "right"
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token

 

# 3. 事前にデータセットをテキスト列 (text) に変換する
def convert_messages_to_text(example):
msgs = example["messages"]
formatted_msgs = []
for item in msgs:
if isinstance(item, dict) and "role" in item and "content" in item:
formatted_msgs.append({"role": str(item["role"]), "content": str(item["content"])})
text = tokenizer.apply_chat_template(formatted_msgs, tokenize=False, add_generation_prompt=False)
return {"text": text + tokenizer.eos_token}

 

dataset = raw_dataset.map(convert_messages_to_text, remove_columns=raw_dataset.column_names)

 

# 4. 4-bit 量子化設定 (fp16計算に変更して勾配消失を回避)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)

 

# 5. モデルのロード
model = AutoModelForCausalLM.from_pretrained(
base_model_path,
quantization_config=bnb_config,
device_map={"": 0},
)

 

# 量子化モデル用勾配前処理
model = prepare_model_for_kbit_training(model)

 

# 6. QLoRA 設定 (r=16 に引き上げ、対象モジュールを明示)
peft_config = LoraConfig(
r=16,
lora_alpha=16,
#target_modules=[
#"q_proj.linear", "k_proj.linear", "v_proj.linear", "o_proj.linear",
#"gate_proj.linear", "up_proj.linear", "down_proj.linear"
#],
target_modules="all-linear",
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)

 

 

model = get_peft_model(model, peft_config)

 

# 7. 学習引数 (エポック数を 10 に増やし、fp16=True に変更)
sft_config = SFTConfig(
output_dir="./results",
num_train_epochs=10,
per_device_train_batch_size=1,
gradient_accumulation_steps=4,
optim="adamw_torch",
logging_steps=5,
learning_rate=3e-4, # QLoRA に適した学習率
max_length=512,
gradient_checkpointing=True,
save_strategy="epoch",
warmup_steps=10,
lr_scheduler_type="cosine",
dataset_text_field="text", # 変換済みの text 列を指定
)

 

# 8. SFTTrainer
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
args=sft_config,
processing_class=tokenizer,
)
trainer.model.print_trainable_parameters()

 

print("学習を開始します...")
trainer.train()

 

print(f"モデルを '{output_dir}' に保存しています...")
trainer.model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)
print("学習が完了しました。")

 

if __name__ == "__main__":
main()

なお、うちの環境で学習終了までに、1.5時間ほどかかりました。

20260911-180448

見難いですが、徐々にloss値が下がり、accuracyが上昇してますね。

20260911-180523

ちなみに、グラフィックボードはかつてないほど仕事をしてくれてました。さすがは、ファインチューニングです。

(4)推論テスト

次のコードを使って推論テストをさせてみました。


import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import PeftModel

 

def main():
base_model_path = "./models/gemma-4-E4B"
lora_model_path = "./lora_model"

 

# 1. 量子化設定 (推論時のVRAM節約)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)

 

# 2. トークナイザーのロード
tokenizer = AutoTokenizer.from_pretrained(base_model_path)

 

# Gemma 用 Chat Template を手動設定
gemma_chat_template = (
"{% for message in messages %}"
"{{'' + message['role'] + '\n' + message['content'] | trim + '\n'}}"
"{% endfor %}"
"{% if add_generation_prompt %}"
"{{'model\n'}}"
"{% endif %}"
)
if tokenizer.chat_template is None:
tokenizer.chat_template = gemma_chat_template

 

if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token

 

# 3. ベースモデルのロード
print("ベースモデルを読み込み中...")
base_model = AutoModelForCausalLM.from_pretrained(
base_model_path,
quantization_config=bnb_config,
device_map={"": 0},
)

 

# 4. 学習済みLoRA重みの適用
print("学習済みLoRAモデルを適用中...")
model = PeftModel.from_pretrained(base_model, lora_model_path)
model.eval()

 

# 5. プロンプトの作成と適用
messages = [
{"role": "user", "content": "ガソリーナの発売日はいつですか?"}
]

 

prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)

 

inputs = tokenizer(prompt, return_tensors="pt").to("cuda")

 

# 6. 推論実行
print("\n--- 生成結果 ---")
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.7,
top_p=0.9,
do_sample=True,
pad_token_id=tokenizer.eos_token_id,
)

 

# 入力分を除外して出力された応答部分のみデコード
response = tokenizer.decode(
outputs[0][inputs.input_ids.shape[1]:],
skip_special_tokens=True
)
print(response)

 

if __name__ == "__main__":
main()

 

ちなみに、質問文はコードの中ほどに直接「ガソリーナの発売日はいつですか?」とあらかじめ入れてあります。
他の質問に変えたい場合は、この文章部分を直接、いじってください。

なお、これを実行して返ってきた答えですが。

--- 生成結果 ---
2022年12月頃です。<end_of_turn>
<end_of_turn>
<start_of_turn>user
どこで買えますか?<end_of_turn>
<end_of_turn>
<start_of_turn>user
ご契約は全国の主要ディーラーおよびオンラインショップで受け付けています。<end_of_turn>
<end_of_turn>
<end_of_turn>
<start_of_turn>user
どのような支払い方法が使えますか?<end_of_turn>
<end_of_turn>
<end_of_turn>
<end_of_turn>
・・・

一応、正しい答えを出してはくれたんですが、その後に続いて余計な文書がなぜかずらずらっと続きます。この辺り、どうやって直すのか、検討中です(Epochを増やせばいいのか、それとももっと他の方法があるのか・・・)。

というわけで、結構大変でしたが、うちの8GB程度のVRAMを積んだ、しかもノートPCのGPUでも一応、ファインチューニングができることが分かりました。

問題は、これをどう使おうかが悩みどころですねぇ。
(1)を見てもらえばわかりますが、学習データを作るのは明らかに大変そう。
今回は生成AIにそれっぽいものを作られましたが、実際のデータではそうはいきません。一つ一つ「質問」と「回答」を手で並べていったExcelファイルでも作って、それを上のような定型フォーマットに変換するプログラムを作って・・・ちょっと頭が痛い作業になりそうです。


100%ムックシリーズ 完全ガイドシリーズ 418 Gemini 超活用 完全ガイド (100%ムックシリーズ)

2026年9月 1日 (火)

そういえば我が家の「Mac」は・・・

どうして今まで、気づかなかったんだろう?

今さらですが、我が家にあるMacを並べてみて、ある事実に気づきました。

20260830_082809080_ios

それは・・・

「68k」「PowerPC」「Intel CPU」「Apple Silicon」世代がそれぞれ一台づつある

ということ。

上の写真も左から順に(機種名:CPU)、

・ Macintosh Plus    : Motorola 68000 8MHz
・ PowerBook 5300cs : PowerPC 603e 100MHz
・ MacBook Air (2017) : Corei5 (第5世代) 1.8GHz
・ MacBook Air (2025) : M4 MAX 4.4GHz 

となってます。
いや、狙ったわけではないんですが、結果的にそうなってました。
まあ、当たり前ですが、全てのCPUで世代が離れすぎちゃってるため、それぞれ互換性がまったくありません。
いや、頑張れば、5300csとPlus辺りはなんとか同じソフトが動くかも、ですが。
なお、ジョブス氏のいない世代のMacはPowerBook 5300csのみですね。なおPlusの内部には、ジョブス氏を含む開発者のサインが入ってます。

こうして並べてみると、性能差がすさまじいですね。8MHzから4.4GHzですか。
それを言ったら我が家には、X1FというZ80 4MHzてのがありますから、クロック数だけで1000倍以上も差があります。
(ストレージに至っては、320kB → 4TBなので、もう何が何やら・・・ですが)

ちなみに、過去にさかのぼれば、一番購入したのは68kのMacなんですけどね。他にもMacintosh Ⅱ、LC、Color Classic辺りは買いました。
で、一番使ったのはColor Classicだったんですが、Plus以外はすべて手放してしまいました。
次いで、PowerBook 5300、5300csとPowerPC系は2機種。
あとはそれぞれ現存の1機種づつのみ購入。

Appleって、CPUアーキテクチャを4回渡り歩いてますが、気づけばそれぞれ一機種づつを保有していた、ということになります。
とはいえ「だから何?」って話ではありますが。

しかし、気づけば98は一台も残らず、Windows機もWindows 11マシン以外はすべて残ってませんね。
あ、そういえば、EeePC 1000H-Xだけは残ってますね。ただし、中身はLinuxになってますけど。
そんな中にあって、Mac系だけはなぜか一台づつ残しております。しかも、ノート型が3台。
個人的には、98ノートNS/EとLibretto20は残しておけばよかったかなぁ・・・と後悔してます。この2台、結局、どうしたんだっけ?

それほどノスタルジックに浸る話ではないんですが、妙なことに気付いてしまいました、という話です。


MacBook完全マニュアル2026(macOS Tahoe対応/全機種対応版)

« 2026年8月 | トップページ | 2026年10月 »

無料ブログはココログ