DeepSeek-R1の動的量子化モデルをローカルPCで動かして、AI小説を書くまで。

DeepSeek-R1のフルモデルを[動的量子化してサイズを大幅に縮小したモデル](https://unsloth.ai/blog/deepseekr1-dynamic)をローカルPC上で動かしてみた。それでも、Q2_K_XL GGUFモデルでサイズは200GBを超える。
更にこのモデルに、PythonやRustのプログラムコードの生成をお願いして、実際に動かしてみた。
最後に悪乗りして、AI小説を書いてもらった。

サイバーエージェントの、14/32Bの蒸留モデルを日本語でfinetuneしたモデルも試してみたが、DeepSeekのフルモデルを量子化したモデルとはやはり精度に明確な差が見られた。

動作環境はUbuntu 22.04, Ryzen 7,64GB メモリ,GPU２枚 24+12GB VRAM 
llama.cppでGPUとCPUをハイブリッドで動作。

まずは対話形式で簡単な質問
```
あなたはITエンジニアです。プログラミングを教えて

> AIによって私たちの暮らしはどのように変わりますか？

AIの進化は私たちの生活を「次元ごと」変革しつつあります。主要な変化ポイントを7つの軸で解説します。

**1. 生産性の量子跳躍**
- 製造業：AI品質検査で不良品率0.01%達成（従来比98%改善）
- 事務作業：RPA+AIで経理処理時間75%短縮
- 農業：AI制御ドローンが1ヘクタールあたり水量30%節約

**2. 超パーソナライズ化**
- 教育：生徒の脳波分析で最適学習サイクンを生成
- 医療：遺伝子プロファイル×生活習慣のAIシミュレーション
- 小売：購買履歴と脳神経反応を連動した商品開発

**3. 意思決定の再定義**
- 法律AI：判例データベースの瞬時分析（裁判時間50%短縮）
- 株取引：感情を数値化する「センチメントインデックス」活用
- 都市計画：人口移動予測AIが10年先の交通需要をシミュレート

**4. 人間能力の拡張**
- 外科：AIアシスト手術で0.1mm精度持続（手振れ補正）
- 創作：NFT生成AIが作家の「思考パターン」を継承
- 言語：リアルタイム翻義（翻訳+解釈）で文化壁溶解

**闇の部分：**
- 監視社会：顔認識精度99.7%が自由を侵食
- 雇用喪失：OECD試算で2030年までに14%職種消滅
- 倫理問題：AI兵器の「意思決定ブラックボックス化」

**未来シナリオ：**
2025年：AI税務申告義務化
2030年：主要企業に「AI倫理委員会」設置義務
2045年：AIがノーベル文学賞候補に選出

重要なのは「人間らしさの再定義」です。AIが処理できる領域と、人間に残された領域の境界線が、今後最も熱い議論になるでしょう。技術進化の速度に、私たちの倫理観や法律が追いつけるかが真の課題です。
```
日本語で質問しても、thinkタグの思考過程は中国語で出力されるが、主文は日本語で答えてくれる。thinkタグの部分は中国語になったので、例ではすべて割愛した。
2045年：AIがノーベル文学賞候補に選出
どうかな？

次はPythonとRustでプログラミング
```
> マンデルブロー集合を描画するプログラムコードをPythonで記述してください。
マンデルブロー集合の描画プログラムを作成します。numpyとmatplotlibを使用して効率的に計算し、可視化します。

# python
import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
width, height = 1000, 1000  # 画像サイズ
max_iters = 100              # 最大反復回数
escape_radius = 2.0          # 脱出判定半径

# 複素平面の生成
re = np.linspace(-2, 1, width)
im = np.linspace(-1.5, 1.5, height)
Re, Im = np.meshgrid(re, im)
c = Re + Im*1j  # 複素数平面の各点

# マンデルブロー計算
z = np.zeros_like(c, dtype=np.complex128)
mandelbrot = np.zeros(c.shape, dtype=np.int32)

for i in range(max_iters):
    mask = np.abs(z) < escape_radius
    mandelbrot += mask  # 反復回数を記録
    z[mask] = z[mask]**2 + c[mask]

# プロット
plt.figure(figsize=(12, 12))
plt.imshow(mandelbrot.T, 
           cmap='hot',
           extent=[-2, 1, -1.5, 1.5])
plt.colorbar(label='Iteration Count')
plt.title('Mandelbrot Set')
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.show()


このコードの特徴:
- ベクトル演算で高速処理（純Pythonループなし）
- 解像度を簡単に変更可能
- カラーマップと反復回数の関係で深淵な構造を表現
- プロット範囲は実部[-2,1]、虚部[-1.5,1.5]

実行すると、黒い部分がマンデルブロー集合本体、色の変化が脱出速度を表現します。最大反復回数(max_iters)を増やすとより詳細な構造が現れます。

> マンデルブロー集合を描画するプログラムコードをRustで作成してください。
Rustでマンデルブロー集合を生成するコードです。PNG画像出力と並列処理を実装しています。

//rust
use image::{RgbImage, Rgb};
use num::complex::Complex64;
use std::sync::mpsc;
use rayon::prelude::*;

const WIDTH: u32 = 1920;
const HEIGHT: u32 = 1080;
const MAX_ITER: usize = 1000;
const ESCAPE_RADIUS: f64 = 2.0;

fn mandelbrot(c: Complex64) -> usize {
    let mut z = Complex64::new(0.0, 0.0);
    for i in 0..MAX_ITER {
        if z.norm_sqr() > ESCAPE_RADIUS * ESCAPE_RADIUS {
            return i;
        }
        z = z * z + c;
    }
    MAX_ITER
}

fn hsv_to_rgb(h: f64, s: f64, v: f64) -> Rgb<u8> {
    let c = v * s;
    let h = h * 6.0;
    let x = c * (1.0 - (h % 2.0 - 1.0).abs());
    let m = v - c;
    
    let (r, g, b) = match h {
        h if h < 1.0 => (c, x, 0.0),
        h if h < 2.0 => (x, c, 0.0),
        h if h < 3.0 => (0.0, c, x),
        h if h < 4.0 => (0.0, x, c),
        h if h < 5.0 => (x, 0.0, c),
        _ => (c, 0.0, x),
    };
    
    Rgb([
        ((r + m) * 255.0) as u8,
        ((g + m) * 255.0) as u8,
        ((b + m) * 255.0) as u8,
    ])
}

fn main() {
    let img = RgbImage::new(WIDTH, HEIGHT);
    
    let (tx, rx) = mpsc::channel();
    
    (0..HEIGHT).into_par_iter().for_each_with(tx, |tx, y| {
        let mut row = Vec::new();
        for x in 0..WIDTH {
            let re = (x as f64 / WIDTH as f64) * 3.5 - 2.5;
            let im = (y as f64 / HEIGHT as f64) * 2.0 - 1.0;
            let c = Complex64::new(re, im);
            
            let t = mandelbrot(c) as f64 / MAX_ITER as f64;
            let color = hsv_to_rgb(t * 360.0, 1.0, t.sqrt());
            row.push(color);
        }
        tx.send((y, row)).unwrap();
    });
    
    let mut img = img;
    for (y, row) in rx.iter() {
        for (x, color) in row.iter().enumerate() {
            img.put_pixel(x as u32, y, *color);
        }
    }
    
    img.save("mandelbrot.png").unwrap();
}

このコードの特徴：

1. **並列処理**：rayonクレートを使用して行単位で並列計算
2. **カラーマッピング**：HSV色空間を使用した鮮やかな着色
3. **最適化**：ノルムの二乗比較で平方根計算を回避
4. **柔軟な設定**：解像度、反復回数は定数で簡単に変更可能

必要な依存関係（Cargo.toml）：
toml
[dependencies]
image = "0.24"
num = "0.4"
rayon = "1.7"


実行方法：
bash
cargo run --release


生成される画像は4K解像度に対応可能で、MAX_ITERの値を増やすとより詳細なフラクタル構造が現れます。色相パラメータを調整することで、様々なアーティスティックな表現が可能です。

```
試してみたが無修正でちゃんと動作するのがすごい。コメントが日本語なのもいい。

最後にAI小説
```
>あなたはプロのルポライターです。近未来の荒廃した東京の浅草で取材をして、廃墟となった地下鉄や、そこで暮らす人々の日常についての記事を書いてください。

【2040年浅草地下図鑑　廃線ホームに生きる人々の記録】  
文・AIロイター通信社 特派員 雨宮隼  

◆朽ちた観音像の足元で  

浅草寺の仁王門は今も残っている。正確には「残されている」と言うべきか。朱色の柱に貼りついた太陽光発電シートが、朽ちた大灯笼を照らす。参道のアーケードは戦後最大の台風で崩れたままだ。だが雷門の交差点から地下へ降りた者だけが知る、第二の浅草がある。  

地下鉄銀座線浅草駅の階段を下りるたび、鉄錆と発酵した人垢の匂いが鼻を刺す。改札跡のコンクリート壁には、手書きの注意書きが重なり合う。「水タンク詰替は18時」「ドローン哨戒区域指定」。赤く光る「浅草地下自治区」の看板が、地下ホームへ続く暗闇を震わせる。  

◆ホーム開墾区の暮らし  

「浅草地下駅」居住区の中心は、かつての1番線ホームだ。天井から吊るしたポリタンクが滴る雨水で、軌道跡の野菜畑が潤う。ホーム端の自動券売機は住民登録棚に改造され、切符の取り出し口からはIDカードが顔を出す。  

「三十年勤めた駅員が、今は米櫃の番人ですよ」  
元駅長の小沼貞三郎（82）が、錆びた改札機をパタンと閉める。地下鉄車両の座席を解体したベッドが並ぶ生活区。壁には手製の湿度計が、常時95%を指している。  

「雨期はカビ戦争ですな。でも日光が要らないから、作物はよく育つ。江戸の頃から、下町は地下がにぎやかでしたからね」  

◆13:15発　生存圏内循環便  

午後1時、浅草駅名物の「かみなり定期便」が到着する。銀座線505系の車体を改造した電動カートが、地下居住区と上野連合市場を結ぶ。積み荷の段ボールには「防カビ剤」「ネズミ駆除用超音波装置」の文字。  

「乗車の方は酸素ボンベをご確認ください！ 次は田原町コロニー！」  
車両連結部で叫ぶ女性は、左腕に鴎外森鴎外の刺青が光る。彼女たち「鴎外組」が管理する地下流通網は、地表の放射能汚染区域を迂回する命の回路だ。  

◆地下仏閣の夜  

午後11時、地下鉄駅深部の「観音堂カフェ」に蝋燭が灯る。元映画館技師の老人が、レンズを磨きながら呟く。  

「浅草の地下は昔から魔界です。戦災の時も、ここだけは焼け残った。今は逆さ富士のように、壊れた東京を支えてる」  

壁の隅では、仏像の台座にUSBメモリが供えられている。データ消滅した観音像の代わりに、住民の記憶ファイルが祀られるのだ。カウンターで提供されるのはインスタントみそしる。原材料欄には「国産大豆（風説）30%」とある。  

◆終電は明け方まで  

午後11時半、鴎外組のドローンが定期放送を流す。「本日の地表線量　0.89ミリシーベルト。ターミネックス社の除染作業は秋葉原駅手前で停滞中」  

暗闇に浮かぶ無数のLEDが、地下ホームの輪郭を描く。誰かが銀座線の車内放送を真似て叫ぶ。「ご乗車ありがとうございます。次は、未来」  

浅草の地底で、廃線図書館のページは今日もめくれる。カビ臭い通帳に記されたのは、地下鉄の定期券番号と、2087年までの使用期限だった。

```
なかなか凄い。