メインコンテンツまでスキップ

「Qwen」タグの記事が22件件あります

Qwen tag description

全てのタグを見る

RTX PRO 6000を手に入れても何も変わらなかった

· 約4分
もみじーな
個人開発者

最近はこのゴミブログを更新するのがめんどくさくなってきたのですが
ドキュザウルスで作ったのを後悔しながら書きます。

RTX PRO 6000搭載PCをBTOで注文したらすぐ届いたのでびっくりですが
今はBTOのほうがコスパが謎にいいですね・・・

なぜ購入したか

RTX 5000S シリーズがでない可能性があるのとRTX 6000シリーズも延期の可能性があるからですね。
追加で言うならIntel Arc Pro とどっちがコスパがいいかなと思ったからです。

外観

BTOなのでこれ以上はないです。 箱は少しほしかったかも
BTOの欠点ですね

Qwen3.5 122b A10Bの速度計測

やりたかったのがこれだけです。
Youtubeに少し前にあげたやつです

RTX PRO 6000

120token/sってところです。

こいつなんでRTX PRO 6000をWindowsで動かしてるんだって思わないでね

Intel Arc Pro を合計80GB

40token/sってところです

結局何も変わらなかった

96GBを手に入れても動かすモデルはQwen3.6 27Bが無難ですね。
Q8もいらないです
Q4と今はほぼ差はなし

結局使えるモデルがQ4レベルだと120bクラスに制限されます。
ってことは選択肢が現状は存在しない

気になったこと

MTPで少しRTX 5090と比較すると伸びないですね
20%くらい差がでるのでなにか処理の差がでてるのかな?

おすすめな人は?

おすすめな人は間違いなくRTX PRO を2枚積み以上できる人です。
それ以外は買ってもメリットなし
120Bとさらに画像生成も動かせますが私はPCは分散させたいのでメリットなし。

これで3枚済みでもして397Bをローカルで動かせる予算があるひとならありかな

おすすめのVRAMは?

おすすめのVRAMは32GBです。
現状 Qwen3.6 27BもGemma4 31bなども基本的にVRAM 32GBにはのります。

ARC PRO B70かR9700を買った方がいいです。
MacのM5 Ultraも今年でるならそっちかな

DGX Stationがほしい

将来的に引っ越したら(何回も言ってるけど)
DGX Stationあたりが買いたいかな。
これは5年後くらいのモデルがほしいです。
おそらくそのころにはローカルAIで十分になります。

最後に

RTX PRO 6000は個人購入はおすすめしないです。
クラウド使ってください。
そもそも現在はローカルAIやるメリットなんかないです。
私が買ってる理由はハードが好きなだけなのでほぼ趣味です。

今後は32GB,24GBにおさまるモデルはRTX 5090かB70,B60でテストして120BクラスはRTX PRO 6000で速度だけテストします。

あと書いておきますがもしローカルAIで十分
全部ローカルAIに仕事まかせてますみたいな話があればなくなる仕事か嘘かですね
SNSとかにめっちゃいますけどどんな仕事だよ
文字お越しとか翻訳とか書類整理か?

Intel Arc Pro B70 32GBによるQwen3.6 27B MTPの簡単な速度テスト

· 約2分
もみじーな
個人開発者

LM StudioがMTPを正式実装したので速度テストです。
ただ最新Vulkanが不安定なので短め

41token/sとまぁ早いですね。

5000トークン使うくらいなら30token/s以上は維持しそうでした。

特に速度以外はかわらないので今回はここで終わります。

動作テスト動画

B70が日本でも18万くらいだったら覇権とった可能性はありますが22万なので買う方はR9700と比べてみて納得したら買ってみてください。

B50が発売されたらしい(関係ない)

関係ないですがSPARKLEのIntel Arc Pro B50が発売されていました。
夏にQnapのNAS買ってGPUでも刺そうか考えてましたがB50は候補に入れるべきか悩みます。
デフォルト対応してないのでDockerで動作させる必要がありますがRTX PRO 2000も値段そんなかわらないので悩み中
NAS用のHDDだけ6TBを10枚先に購入したのでNASを買うことは決まっていますがどのモデルにするか

RTX5090で計測したら悲しくなった

追記です。

さすがにここまで差がでるとね・・・
ドラフト数上げるとさらにあがるのでね・・・
130token/s近くでますね

Vulkanの場合

Vulkanだとちょっと遅いみたい。

ということはB70も最適化によっては50token/sくらいでるかも

Intel Arc Pro B70 32GBでQwen-Imageを試したよ

· 約2分
もみじーな
個人開発者

2512版です
B60との比較のために前の環境をそのまま使いました。

とりあえずテストでまた作成したLoraがあるのでそれを使って生成テストです。

VRAMを約27GBも使ってます。

1920x1080の25ステップが初回生成が315秒で2回目が250秒でした。
さすがに遅いので前回と同じく20ステップへ変更

20ステップで約210秒まで縮みました。
B60が約360秒だったのでまぁ? 8ステップだと120秒ですがLoraが微妙です。

確かに早くなりましたがちょっとね?

生成した画像とか

一応サンプル貼っておきます。
使ったLoraは元画像が3枚だったので無理やり学習テストしてみました。
少ない画像でどうスタイルLoraをつくるかという謎研究ですね。
分割学習してるのでLoraが3つで安定しましたね

学習に使用した画像がなにかって?
なんかのCDアルバム画像です。

最後に

今回のテストを踏まえて今後もB70で画像生成するかといわれると絶対にないです。
この様子なら使ったことないけどLTX-2.3もテストする価値はそんなないのかな

あとB70はB60よりかなりファンがうるさいです。
もしかしたら個体値があるのかもしれないですが人によっては気にするはずです。
私はブレードサーバーの横で寝れるのでヘッドホンすれば隣でゲームもできますし気にしないです。

高負荷時をたとえるなら電動エアダスターの音ですね
眠くなったからLTXのモデルダウンロードしながら寝よ

Qwen3.7-Max-Previewを簡単にテストする

· 約6分
もみじーな
個人開発者

Qwen3.6 122Bでないかなと思ってたら先にQwen3.7-Max-Previewがでましたね。
27Bとかがでるのか不明ですがテストです。
今日、Arc Pro B70が届くので暇つぶしです。

APIとか公開されてないので公式のQwen Chatからです。
表示されない場合はパラメータとかで呼び出せます。

ギアテスト

もうプロンプトはカットします。

重なりはありますが回転方向とかに間違いはなかったです。
APIの値段次第ではかなりいいです。

地球儀

1回じゃ表示されずですね。

ドラえもんについて聞いてみた

ドラえもんについて知っていることをまとめて

やっぱ知識量はありますよね

🤖 ドラえもん (Doraemon) 知識まとめ
1. 作品概要
原作者: 藤子・F・不二雄
ジャンル: SFギャグマンガ / 生活ギャグ
初出: 1970年(昭和45年)1月号発売の学習雑誌(『よいこ』『幼稚園』など6誌同時連載)
単行本: てんとう虫コミックス全45巻(その他、大長編など)
あらすじ:
22世紀の未来からやってきた猫型ロボット「ドラえもん」が、何をやっても失敗ばかりの小学生「野比のび太」を、未来のひみつ道具を使って助ける(あるいは騒動を起こす)物語。のび太の未来をより良いものに変えることが目的。
2. 主要キャラクター
キャラクター
特徴
ドラえもん
22世紀製の猫型ロボット。耳をネズミに食べられ、泣いて青くなった。どら焼きが好物。
野比のび太
運動神経ゼロ、勉強もダメ、遅刻の常習犯。しかし、射撃とあやとりは天才的。心優しい性格。
源静香 (しずか)
のび太の憧れのマドンナ。お風呂好き。焼き芋が好物だが恥ずかしくて隠している。
剛田武 (ジャイアン)
ガキ大将。「お前のものは俺のもの」が信条。歌は致命的に下手だが本人は自信満々。
骨川スネ夫
裕福な家庭の息子。自慢癖があり、ジャイアンに取り入ってのび太をいじめることが多い。プラモ好き。
ドラミ
ドラえもんの妹。高性能でしっかり者。メロンパン(あるいはドラ焼きの皮)が好き。
セワシ
のび太の玄孫(やしゃご)。のび太の借金を返すためにドラえもんを過去へ送った張本人。
3. 代表的なひみつ道具
どこでもドア: 行きたい場所を思い浮かべて開くと、その場所に繋がっているドア。
タケコプター: 頭につけると空を飛べる道具。バッテリー切れに注意。
タイムマシン: 机の引き出しの中にあり、過去や未来へ行ける。
スモールライト / ビッグライト: 光を当てたものを小さく/大きくする。
ほんやくコンニャク: 食べるとどんな外国語や宇宙語も理解・会話できるようになる。
もしもボックス: 「もしも〇〇な世界だったら」という平行世界を作り出せる電話ボックス型の道具。
4. ドラえもんのスペックと設定(129.3の法則)
ドラえもんの設定数値には「129.3」が多く使われている(当時の小学4年生の平均身長などが由来とされる)。
誕生日: 2112年9月3日
身長: 129.3cm
体重: 129.3kg
パワー: 129.3馬力
ジャンプ力: 129.3cm
走行スピード: 時速129.3km
製造工場: 東京マツシバロボット工場
5. メディア展開と歴史
アニメ
日本テレビ版 (1973年): 通称「幻のドラえもん」。声優は富田耕生→野沢雅子。フィルムが行方不明になっていた時期がある。
テレビ朝日版 (1979年〜現在):
大山のぶ代期 (1979-2005): 長きにわたり親しまれた黄金期。
水田わさび期 (2005-現在): 声優・画風をリニューアルし、現在も放送中。
映画(大長編ドラえもん)
1980年『のび太の恐竜』から続く劇場版シリーズ。
日常のギャグとは異なり、冒険、友情、環境問題、戦争の愚かさなどシリアスで壮大なテーマを扱うことが多い。
6. 有名な都市伝説と真相
ネットや口コミで広まった噂の多くはデマである。
❌ 「のび太は植物人間で、すべては夢だった」 → 嘘
❌ 「ドラえもんのバッテリーが切れて、のび太が科学者になって直す」 → 嘘(二次創作が元ネタ)
❌ 「タレントが死亡したから放送中止になった回がある」 → 嘘(「タレント」という名前のキャラが登場する回『タレント』が存在するだけ)
⭕ 「最終回はない」 → 作者が逝去したため、明確な「最終回」は存在しない(連載終了時のエピローグ的な回はいくつかある)。
7. 社会的・文化的影響
アニメ大使: 2008年、外務省により初代「アニメ文化大使」に任命された。
東京オリンピック: 2020年招致活動のアンバサダーを務めた。
アジアでの人気: 中国、東南アジアなどで絶大な人気を誇り、海賊版が溢れるほど愛されている。
名言:
「人は、人の幸せを祈ってやれるほど、偉くはないんだよ」
「他人の不幸を喜ぶような、そういう人間に育ってほしくない」
(※これらは映画や原作のシリアスな場面で語られる、藤子・F・不二雄のメッセージ性が強い言葉)
8. 作品のテーマ
一見すると「便利な道具に頼る怠惰な子供」の話だが、根底には以下のテーマが流れている。
SF(すこし・ふしぎ): 日常の延長にある不思議。
因果応報: 道具を悪用したり、調子に乗ると必ずひどい目に合う(自業自得)。
成長と自立: 最終的にのび太が自分の力で困難を乗り越える瞬間の描写。
弱者への眼差し: いじめられっこののび太視点から見る、優しさや正義のあり方。

速度が遅すぎる件

遅すぎてこれ以上のテストどころではなかったです。
ある程度処理すると体感で3token/s

まだ負荷が高いのかもしれないのでAPIがでてから使った方がいいかも

最後に

前みたいにQwen3.7のCoder 80Bがほしいぞおおおおおお

Qwen3-Coder-NextをIntel Arc Pro B60でGPUフルロードしてみる

· 約6分
もみじーな
個人開発者

Qwen3-Coder-NextがでましたがVS Codeのエージェント機能でOpenRouterを使ってテストした時に案外よかったのでローカルで使えないかGPUでの速度検証です。

ちなみにQwen3-Coder-Nextでエージェントを動かしたらWindowsのフォルダ上では見えないフォルダを作り始めましたので注意が必要です。
ただガイドを読ませてのコード生成はClaude 3.7か4に近いものを作成してくれたので良かったです。

エージェント性能はそこそこ高そう?

今回もOllamaではなくLM Studioです。
Qwen3-Coder-NextはMXFP版を使いました。
Q4KS版も使ってみましたが速度はあんまりかわらないです。

Intelの最新のドライバーでは速度が低下しますが今回はあえて最新を使います。
一応、ダウングレードでのテスト結果も作成しました・・・

今回の設定

コンテキスト長を2万くらいにしてるはのあまり読み込んでも遅くなるだけなので・・・
あと読み込めても6,7万トークンが48GBじゃ限界

まず短いもの

こんにちはとうってみました35token/sでした。
まぁ、こんなもんかって感じです。
あれ?Ryzen AI Maxのほうが早かった気が?
嘘だといってくれIntel
最適化の問題だよなIntel

500文字指定

累計418トークンを使い 20token/sまで速度が低下します。

長いコード生成と連続生成

長いコード

長いコードを書かせるとこんな感じです。
使ったプロンプトは以下です。

あなたは世界最高峰のフロントエンドエンジニアです。
以下の要件定義に基づいて、レンタルサーバーで動作する「没入感のあるハッカー風Webサイト」のコード(HTML/CSS/JS)を作成してください。

1. サイトのコンセプト
「極秘システムのアクセス端末」
ユーザーがサイトに訪れると、そこは謎の組織のサーバーへの侵入画面であるという設定です。
全体的にダークで、サイバーパンクな雰囲気(黒背景×緑色のネオン)で統一してください。

2. 必須ギミック(要件)
以下の4つの動的なギミックを必ず実装してください。

1. マトリックス・レイン(背景):
HTML Canvasを使用し、緑色の文字(数字・半角カナ・アルファベット)が雨のように降り注ぐエフェクトを背景全体に描画してください。

2. タイプライター・オープニング:
ページ読み込み時、メインのメッセージ(例: "INITIALIZING CONNECTION...", "ACCESS GRANTED.")を、一文字ずつタイピングされているかのように表示してください。

3. CSSグリッチ・エフェクト:
サイトのメインタイトル(例: "SYSTEM 32")に対し、CSSの `@keyframes` と `clip-path`、`text-shadow` を駆使して、時折ノイズが走って文字がズレるような「グリッチアニメーション」を適用してください。

4. フェイク・ターミナル(対話機能):
画面下部にコマンド入力欄(`input type="text"`)を設けてください。
デザインは黒背景に緑文字で、左側に `visitor@root:~$` のようなプロンプトを表示してください。
以下のコマンドに対応するロジックをJavaScriptで書いてください(if文やswitch文を使用)。
`help`: 使用できるコマンド一覧を表示。
`about`: サイトの架空の説明を表示。
`clear`: ターミナルのログを消去。
それ以外: "Command not found" と表示。
重要: 入力された内容は画面内のログエリアに表示するだけに留め、サーバーへの送信は一切行わないでください(XSS対策として、入力値はテキストとして安全に処理すること)。

3. ファイル構成と技術スタック
HTML5: `index.html`。セマンティックなマークアップ。
CSS3: `style.css`。Google Fonts("Share Tech Mono" や "Courier Prime" 等)のCDNを含め、ハッカーらしい等幅フォントを使用してください。
JavaScript: `script.js`。ライブラリ依存なしのVanilla JS。

4. 安全性への配慮
ターミナル機能はすべてクライアントサイド(ブラウザ内)で完結させてください。
外部へのデータ送信機能は実装しないでください。

5. 出力
`index.html`, `style.css`, `script.js` の3つのコードブロックを出力してください。

できたのはこんな感じ

連続生成する

次に会社のホームページを考えてみてと入力して送信してみました。
2/2になってるのはループに入ったから一度キャンセルしてモデルも再ロードしました・・・

連続生成する2

最後に午年にちなんだWebアプリを考えさせてみました。
少しtoken数がずれてますが2万トークンを86%使って12token/sを維持できてるのでまぁ、使えなくはないですね。

できたサイトですが少し名前がおしゃれなのがポイント高いです。

ドライバーをダウングレードしてみる

2025年7月のドライバーでのテストです。
32.0.101.6862というバージョンです。

長いコード

30token/sです。

500文字指定

34token/sです。

最後に(感想とか)

結構いいモデルですよね。
ローカルだけで使うなら十分使えるモデルです。

ただIntel Arc Pro B60のドライバーが不安定すぎてRyzen AIにすら負ける始末。

発売前のバージョンまでダウングレードしたほうが安定するってどういうこと・・・

Ubuntuでも安定しないしB60君は何なら輝くのか

x8/x8までしか対応してないので買わないけど3枚買ってgpt-oss-120b動かすとかは考えない方がいいです。

個人なら買っても1,2枚かな3枚必要なモデルは帯域速度的にあまり期待でないのでどうしてもVramが必要か企業とかで試したいとかになるのかな・・・

たぶん個人購入ならRyzen AI買った方が幸せかなまだ・・・

それともllm-scaler-vllmを使えば早くなるんですかね?

WSL2のUbuntuだとGPUが認識してくれないのであきらめてましたが

Ubuntuもあれから試してないけど最適化されてる可能性はありますのでそのうち

ConoHa VPSのL4 24GBサーバーを少しだけ使ってみる

· 約3分
もみじーな
個人開発者

タイトル通りです。
ConoHa VPSでL4サーバーを使ってみました。

LocalAIの構築方法はNextcloudにLocalAIを導入してみる(GPU)としてメモしてあります。

今回の目的はNextcloudにGPUサーバーを使ったAI導入(LocalAI)のテストの為です。

結論を最初に書いておきますが圧倒的にディスクの容量が足りないです。

ディスク100GBで使うならモデルを厳選する必要がありそうです。

ただかなり安いです。

1時間66円でレンタルできます。

最大39930円と正直な話をするなら24GBのL4 GPUが使いたいだけならかなりお得。

テストで4時間くらい借りましたけど安いですね。

しかも今なら2000円分の駅伝記念クーポンを配布してたので無料でした。
GPUサーバーにも適用されるのかは不明なんですけね・・・
まぁされなくても4時間なので数百円

以下からLocalAIの簡単なテスト結果

ConoHa VPSのL4 24GBによるLocalAIの簡単な速度テスト結果

2モデルだけです。
gpt-oss-20bも計測しましたがスクショ忘れましたね。

GLM-4.7-Flash

token/sが16.7です。

Qwen3-30B-a3b

token/sが38.2です。

ConoHa VPSのL4サーバーを使ってみての感想

容量不足!!!
モデルとかダウンロードしたらすぐ足りなくなりました。

本当はZ-Imageも使えるみたいだったので試したかったんですけどね・・・

容量不足だと警告がでてしまいました。

なぜかGLM-4.7-Flashが消せなくなったのもあり面倒くさいので今日はここであきらめました。

GPUサーバーにもクーポンが適用されるようならLora学習のテストでもしてみようかな・・・


2026年2月1日追記ですがGPUサーバーもクーポンは適用されていたので時間があるときにLora学習は試してみます。

Qwen-Image-2512をArc Pro B60で試したら遅かった

· 約2分
もみじーな
個人開発者

※1月12日に生成速度結果について少し追記しました。


HyperNova 60Bというモデルのテストするついでに試してますがタイトル通りです。

遅いです。

生成はできますがさすがに5090をこれは使います・・・

そもそもIntel GPUのComfyUIの入れ方を調べるのめんどくさかったのでAI Playgroundについてるじゃんと思ってそれを使っているのでこれで遅くなっている可能性はありますがね・・・

生成テスト結果

設定は私の好きな20stepの解像度は1920x1088です。
Loraは現在、テストで作成中のものをつかっています。
1生成が445秒はさすがに遅いです。

2枚目の生成なら変わるかと思い連続でやりましたがあんまりかわらず。
確かに427秒と短くなってますが誤差ですよねこれもう

追記してます。
結局、設定見直したりしたら20stepでも360秒程度になりました まぁ、1枚360秒はさすがに遅いのに変わりはないですけども

一応,Lightningを使って4stepと8stepでテストしましたが画質が微妙です。
4stepが205秒、8stepが265秒って感じですね。
やっぱり20stepはほしい。
Lightningも確かに4,8stepである程度きれいになるんですけど画質はかなり落ちてます。
つけたとしても20stepにします・・・

20stepで生成した画像だけ1枚貼っておきます。

1024*1024の生成テストも追加で貼っておきます。
270秒まで縮みます。

Intel Arc Pro B60でもやっぱりQwen-Imageレベルは遅いですね。

ただ動かせるのでfp8版が動かしたいだけの方にはIntel Arc Pro B60は選択肢に入るのかもしれないですね。

一応,最後に生成中のメモリ使用率です。
1枚目のIntel Arc Pro B60で生成してます。

Qwen-Image-2512のLoraができたからQwen-Imageと簡単な比較してみただけ

· 約7分
もみじーな
個人開発者

Qwen-Image-2512が出ましたね・・・・

Loraがそのまま使えると思ったのですがね・・・

ダメでしたので作り直しました。

前のやつの修正版なのもあり何かが変わったわけではないので簡単な比較です。
(人などがリアルになったり細かい描写の修正らしいですがLoraメインの私には人がリアルになってもあまり・・・)

あとは結局,Z-ImageもQwenもそうですがNSFWが微妙なんですよね。

それもあって結局、みんなStable Diffusionですよね。

そろそろ規制解除版でたのかな?

一応、結論を書いておきますがLora適用時の安定性が少し増していました。

もしかしたらai-toolkitのLora作成用データが良くなっただけの可能性もありますが後でヴィタちゃんLoraを作成して考えます。

Qwen-Image-2512のLoraの作成方法

一応、書いておきます。

今回,Lora作成にはQwen-Image,Z-Imageと同じくai-toolkitを使用しています。

https://github.com/ostris/ai-toolkit

RTX50シリーズだと以下で動きます。
RTX5090で今回もQwen-Image-2512専用で再インストールしているので問題ないですがもしかしたらそろそろtorchが新しくでてるかもしれなです。
面倒くさいので確認してないので安定性を求める方は最新版がでてないか確認してみてください。

git clone https://github.com/ostris/ai-toolkit.git
cd ai-toolkit
python -m venv venv
.\venv\Scripts\activate
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
pip install -r requirements.txt

起動

cd ui
npm run build_and_start

一回,buildした後は以下のほうが起動が早いです。

cd ui
npm run start

簡単なai-toolkit設定画面の説明

New Jobでだいたい以下の設定にしてもらえれば動きます(ai-toolkit公式からのおすすめです。)
3bit with ARAが24GB推奨です。
4bit with ARA が32GB推奨です。
私は5090なので4bitでいいはずですが余裕を持たせるために一応3bitにしてみてます。
名前やステップ数も自由に変更してください。
私は3000stepにしてますが1500stepの方が人気な気もします。
ここでは見えないですがさらに下にサンプルプロンプトの設定がありますがお好みです。
精度があがりますが面倒くさいので私はだいたいそのままにしてますね

あとはCreate Jobして開始するだけです・・・
開始した後のインストールが長いです。
新しいやつが出るたびに再インストールしているせいでSSDがどんどん埋まっていくので対策を考え中です。

前のLoraを使ってみた

プロンプトは以下です(適当)

カフェで女性がコーヒーを飲んでいる

見てください前のLoraは完全に死にました。

新しいLoraをテストする

プロンプト1

プロンプトは前のLoraと同じです。

カフェで女性がコーヒーを飲んでいる

いい感じですね。
やっぱりQwen-Imageってプロンプトが同じだと似た構図になりますよね?
Stable Diffusionはランダム要素があって好きだったんですけどね・・

プロンプト2

動物園でパンダがこちらを見ている

まぁ、パンダって感じです。
そもそも学習データに動物を含ませてないのでちゃんと出ているのかは不明

前作のQwen-Imageと簡単に比較してみる

Z-Imageの時に使ったプロンプトと画像をできるだけ流用してます。
生成時間は前作と変わってなかったのでカットします。

プロンプト1

見渡す限りのひまわり畑の中に佇む美少女。風になびく長い髪、背景には夏の巨大な入道雲と透き通るような青空。繊細な光の表現と鮮やかな色彩。キラキラとした瞳、ドラマチックな構図、幻想的な夏の思い出。

Qwen-Image-2512

Qwen-Image

プロンプト2

前のやつからコピーして思ったけどこれ前のひまわり畑のやつと合体してたのね(これは直しました)

幻想的な水族館。巨大なアクリルパネルの大水槽の前に佇む美少女。深い青とエメラルドグリーンの光が彼女を照らし、水槽の中ではジンベエザメやマンタ、色鮮やかな魚の群れが渦を巻いて泳いでいる。水面から差し込む光の柱(チンダル現象)と、キラキラと輝く無数の泡。少女は感動して水槽を見上げている。繊細で透明感のある背景美術、ドラマチックな構図、鮮烈な色彩。圧倒的な没入感。

Qwen-Image-2512

Qwen-Image

プロンプト3

神聖で幻想的な夜の神社。無限に続く赤い鳥居のトンネル。宙に浮く無数の狐火(きつねび)や灯籠の温かいオレンジ色の光。豪華な着物を着た銀髪の美少女が、振り返っている。周囲には蛍が舞い、森の木々が静かに見守っている。神秘的で静寂な雰囲気、魔法のような光の演出、高精細な描写。

Qwen-Image-2512

Qwen-Image

プロンプト4

ここで少し差が出てますが環境によってLoraが崩れることがあったのですがいい感じになってますね

水着の女性がプールにいる。

Qwen-Image-2512

Qwen-Image

プロンプト5

なんとなく3枚生成したので3枚貼っておきます。
プロンプトは例です。
少しいじったりしてます。

1girl,solo,animal ears,brond hair,short hair,sleeveless,elbow gloves,socks,extra ears,sleeveless_shirt,skirt,belt,tail,yellow_eyes,serval,bowtie,arms up,shoe,savannah,scary smile

Qwen-Image-2512

Qwen-Image

プロンプト6

プロンプトをメモり忘れましたが2512が私の作成したLora的には忠実です。
あと指の数を見たらわかるのですが明らかに本数が増える現象が解消されてます。

Qwen-Image-2512

Qwen-Image

結論

めちゃくちゃ変わったかと言われればLoraを適用すると違いはよくわかりませんがLora適用時に指が増える現象は明らかにへってました。
プロンプト6を見てもらえればわかります(まぁ、前の状態でもネガティブプロンプトとかで直せるんですけども)

あとはヴィタちゃんLoraを作ってから比較して学習データなどを増やしてみるか決めたいと思います。

Qwen-Image-Editを使った動画のフレーム置き換え

· 約2分
もみじーな
個人開発者

Wan2.2 Animateだとアニメベースの動画だったりだと置き換えが不安定なのでテストしてみました。

やり方

怒られそうなのでだいぶ簡単に書きます。
一応、自動化してますが1フレームごとにOpenCVで切り取りながら同じ画像じゃないかだけ判定してQwen-Image-Editに飛ばしてry
さらにキャラを固定させるためにプロンプトをある程度細かく長くつくりLoraも強めに当ててます。

テスト動画1(初回テスト)

Youtubeの【未確認で進行形】というアニメOPを360Pで5秒くらいだけ切り取り生成した動画です。

怒られそうなので動画は調べてください。

2期まだか?

ステップ数4で各フレーム生成してます。

このテストの失敗点は360Pで切り取ったという解像度の低さとフレーム取得の不安定とLoraとプロンプト,ステップ数,etc(きりがないですね)

テスト動画2(微調整テスト)

みんな大好きLonely Lonelyのトレース + Lora適用です。

だいぶよくなったのではないかと思いますがフレーム数,解像度,ステップ数,書き出しがバグって解像度がおかしくなった,etc・・・

ステップ数8で各フレーム生成してます。

まぁ、だいぶいいですが私のテストはここで終わります。

結論

やろうと思えばアニメのトレースがいけそう

そして色んな所から怒られそう。

ここでやめておきます。

C# WPFでQwen3を使った完全ローカル翻訳システムをGithub Copilotと作ってみた

· 約7分
もみじーな
個人開発者

今回のプログラム(LocalTranslatorWPF)
Readmeはないです。

LLamaSharpの使い勝手がいいので完全ローカルの翻訳システムが作れないかと思いVisual Studio 2022で作成してみました。(作らせた)
本当にコードをゼロから作ることがなくなりました。(修正は必要)
モデルもLM Studioから引っこ抜いて使ってます。

ローカルでさらにAPI不要なので業務でもExcelアドインとかCADアドインとしても使えそうでした。

LLamaSharpを使用

前回と同様にLLamaSharpとLLamaSharp.Backend.CpuとCudaをNugetでインストール

2GB以上のモデルは今回、強制的にGPUのCudaを使うようにしてます。

さすがCudaって感じでした。前回はなしで作りましたがボタン押したら秒です。
毎回モデルを読み込むのがネックなくらいです。

動作確認モデル

Qwen3とGemma3で動作テストしてます。(思考モードあってもなくてもいい様にしてるはず)

基本的に4bモデル以上なら動作は安定してました。

小さいモデルは翻訳レベルが低くまともに使えなかったのと思考モードがループに入ることがあったので使えなかったです。

翻訳レベルと翻訳結果

翻訳に使った文章

英文と日本語(Gemini Pro2.5で生成しましたので翻訳の品質が分からない)

英文: Regular exercise is important for maintaining good health. 
訳: 定期的な運動は、健康を維持するために重要です。
英文: Technological advancements, particularly in artificial intelligence, are rapidly transforming our daily lives. While they offer unprecedented convenience, they also present new ethical challenges that society must thoughtfully address.
訳: 技術の進歩、特に人工知能は、私たちの日常生活を急速に変革しています。それらは前例のない利便性を提供する一方で、社会が慎重に対処すべき新たな倫理的課題も提示しています。

Qwen3 4b

Qwen3 8b

翻訳精度(わからない)

どうなんですかね。
元の文章もAIで生成していることもあって翻訳精度がまったくわからないです。
あとは翻訳をどんな感じにさせるかのプロンプトしだいですかね。

コード内容

Copilot君に作ってもらったのを修正してます。
TranslationServiceがメイン処理なのでとりあえずここだけ
残りはGithubで公開しました。
LLamaModelsにあるモデルを自動で読み込みます。

TranslationService.cs[クリックして展開]
using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using LLama;
using LLama.Common;
using LLama.Sampling;
using LocalTranslatorWPF.Models;

namespace LocalTranslatorWPF.Services
{
public class TranslationService : IDisposable
{
private LLamaWeights _model;
private LLamaContext _context;
private bool _isInitialized;

public async Task<bool> InitializeModel(ModelInfo modelInfo, bool useGPU, Action<string> logCallback = null)
{
try
{
Cleanup();

logCallback?.Invoke($"モデルを読み込んでいます: {modelInfo.Name}...");

var parameters = new ModelParams(modelInfo.Path)
{
ContextSize = 2048,
GpuLayerCount = useGPU ? 35 : 0,
UseMemorymap = true,
UseMemoryLock = false
};

_model = await Task.Run(() => LLamaWeights.LoadFromFile(parameters));
_context = _model.CreateContext(parameters);
_isInitialized = true;

logCallback?.Invoke($"モデルの読み込みが完了しました。GPU使用: {useGPU}");
return true;
}
catch (Exception ex)
{
logCallback?.Invoke($"エラー: {ex.Message}");
_isInitialized = false;
return false;
}
}

public async Task<string> TranslateAsync(TranslationRequest request, Action<string> progressCallback = null, CancellationToken cancellationToken = default)
{
if (!_isInitialized)
throw new InvalidOperationException("モデルが初期化されていません。");

// 同じ言語かどうかをチェック
var detectedLanguage = DetectLanguage(request.SourceText);
var targetLanguage = request.TargetLanguage;

// 日本語→日本語、英語→英語の場合はスキップ
if ((detectedLanguage == "Japanese" && targetLanguage == "Japanese") ||
(detectedLanguage == "English" && targetLanguage == "English"))
{
var message = detectedLanguage == "Japanese"
? "日本語から日本語への翻訳のため、翻訳しませんでした。"
: "英語から英語への翻訳のため、翻訳しませんでした。";

progressCallback?.Invoke(message);
return message;
}

var prompt = CreateTranslationPrompt(request);
progressCallback?.Invoke("翻訳中...");

var inferenceParams = new InferenceParams
{
MaxTokens = 2048,
SamplingPipeline = new DefaultSamplingPipeline
{
Temperature = 0.6f,
TopP = 0.95f,
TopK = 20,
MinP = 0
},
AntiPrompts = new[] {
"<<<END>>>",
"\n\n\n",
"###",
"\n---"
}
};

var executor = new InteractiveExecutor(_context);
var result = new StringBuilder();

await foreach (var text in executor.InferAsync(prompt, inferenceParams, cancellationToken))
{
result.Append(text);
var currentText = result.ToString();

// 終了デリミタを検出
if (currentText.Contains("<<<END>>>"))
{
break;
}

// 進捗表示用に翻訳結果を抽出
var extractedTranslation = ExtractTranslationFromDelimiters(currentText);
if (!string.IsNullOrEmpty(extractedTranslation))
{
// 元のテキストと同じ場合は表示しない(翻訳失敗の可能性)
if (!IsSameContent(extractedTranslation, request.SourceText))
{
progressCallback?.Invoke(extractedTranslation);
}
}
}

// 最終的な翻訳結果を抽出
var finalResult = ExtractTranslationFromDelimiters(result.ToString());

if (string.IsNullOrEmpty(finalResult))
{
// デリミタ抽出失敗時はテキストクリーニングにフォールバック
finalResult = CleanTranslationResult(result.ToString(), request.SourceLanguage);
}

// 元のテキストと同じ場合はエラーメッセージ
if (IsSameContent(finalResult, request.SourceText))
{
var errorMessage = "翻訳に失敗しました。モデルが指示を理解できませんでした。";
progressCallback?.Invoke(errorMessage);
return errorMessage;
}

progressCallback?.Invoke(finalResult);
return finalResult.Trim();
}

private bool IsSameContent(string text1, string text2)
{
if (string.IsNullOrWhiteSpace(text1) || string.IsNullOrWhiteSpace(text2))
return false;

// 空白と句読点を除去して比較
var normalized1 = Regex.Replace(text1.ToLower(), @"[\s\p{P}]", "");
var normalized2 = Regex.Replace(text2.ToLower(), @"[\s\p{P}]", "");

// 完全一致または90%以上一致していれば同じとみなす
if (normalized1 == normalized2)
return true;

// レーベンシュタイン距離で類似度チェック
int distance = LevenshteinDistance(normalized1, normalized2);
int maxLength = Math.Max(normalized1.Length, normalized2.Length);
double similarity = 1.0 - (double)distance / maxLength;

return similarity > 0.9;
}

private int LevenshteinDistance(string s1, string s2)
{
int[,] d = new int[s1.Length + 1, s2.Length + 1];

for (int i = 0; i <= s1.Length; i++)
d[i, 0] = i;
for (int j = 0; j <= s2.Length; j++)
d[0, j] = j;

for (int j = 1; j <= s2.Length; j++)
{
for (int i = 1; i <= s1.Length; i++)
{
int cost = (s1[i - 1] == s2[j - 1]) ? 0 : 1;
d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost);
}
}

return d[s1.Length, s2.Length];
}

private string ExtractTranslationFromDelimiters(string text)
{
if (string.IsNullOrWhiteSpace(text))
return string.Empty;

// <<<START>>> と <<<END>>> の間を抽出
var match = Regex.Match(text, @"<<<START>>>(.*?)(?:<<<END>>>|$)", RegexOptions.Singleline);
if (match.Success && match.Groups.Count > 1)
{
return match.Groups[1].Value.Trim();
}

return string.Empty;
}

private string DetectLanguage(string text)
{
if (string.IsNullOrWhiteSpace(text))
return "Unknown";

// 日本語文字(ひらがな、カタカナ、漢字)の割合をチェック
int japaneseCharCount = 0;
int totalChars = 0;

foreach (char c in text)
{
if (char.IsWhiteSpace(c) || char.IsPunctuation(c))
continue;

totalChars++;

if ((c >= 0x3040 && c <= 0x309F) || // ひらがな
(c >= 0x30A0 && c <= 0x30FF) || // カタカナ
(c >= 0x4E00 && c <= 0x9FAF)) // 漢字
{
japaneseCharCount++;
}
}

if (totalChars == 0)
return "Unknown";

double japaneseRatio = (double)japaneseCharCount / totalChars;
return japaneseRatio >= 0.3 ? "Japanese" : "English";
}

private string CleanTranslationResult(string result, string sourceLanguage)
{
// デリミタを削除
result = result.Replace("<<<START>>>", "").Replace("<<<END>>>", "");

// 改行が2つ以上続く場合、最初の部分だけを取得
var parts = result.Split(new[] { "\n\n" }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length > 0)
{
result = parts[0];
}

// 不要な接頭辞を削除
var prefixesToRemove = new[]
{
"英語: ",
"日本語: ",
"English: ",
"Japanese: ",
"翻訳: ",
"Translation: ",
"訳: "
};

foreach (var prefix in prefixesToRemove)
{
if (result.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
result = result.Substring(prefix.Length);
}
}

return result.Trim();
}

private string CreateTranslationPrompt(TranslationRequest request)
{
if (request.SourceLanguage == "Japanese")
{
// 日本語→英語(Few-shot付き)
return $@"あなたは翻訳者です。日本語を英語に翻訳してください。

例1:
日本語: こんにちは、元気ですか?
翻訳: <<<START>>>Hello, how are you?<<<END>>>

例2:
日本語: 今日は良い天気ですね。明日も晴れるそうです。
翻訳: <<<START>>>It's nice weather today.It's supposed to be sunny again tomorrow.<<<END>>>

実際のタスク:
日本語: {request.SourceText}
翻訳: <<<START>>>";
}
else
{
// 英語→日本語(Few-shot付き)
return $@"あなたは翻訳者です。英語を日本語に翻訳してください。必ず日本語で答えてください。

例1:
English: Hello, how are you?
翻訳: <<<START>>>こんにちは、元気ですか?<<<END>>>

例2:
English: It's nice weather today.It's supposed to be sunny again tomorrow.
翻訳: <<<START>>>今日は良い天気ですね。明日も晴れるそうです。<<<END>>>

実際のタスク:
English: {request.SourceText}
翻訳: <<<START>>>";
}
}

private void Cleanup()
{
_context?.Dispose();
_model?.Dispose();
_context = null;
_model = null;
_isInitialized = false;
}

public void Dispose()
{
Cleanup();
}
}
}