0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

圧縮バージョンのDeepSeekをローカルで。CPUとDRAMで推論,GPUとVRAMで推論。超簡易備忘録。

Last updated at Posted at 2025-03-31

import

from transformers import AutoTokenizer
from transformers import AutoModelForCausalLM
import torch

完成関数(CPUとDRAMで推論バージョン)

## CPU-DRAMでの推論は、入力コーパス500の出力300では、1時間40分程度かかります。

        def run_deepseek_inference(self, corpus: str) -> str:
            model_name = "deepseek-ai/deepseek-coder-1.3b-base"

            tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=True)
            tokenizer.padding_side = "left" 

            model = AutoModelForCausalLM.from_pretrained(
                model_name,
                device_map=None,  # GPU使わない
                torch_dtype=torch.float32,
                low_cpu_mem_usage=True,
                use_auth_token=True,
            )

            inputs = tokenizer(corpus, return_tensors="pt")
            max_new_tokens = 300  # ここで最大トークン数を指定
            generated_text = corpus  # 初期入力はコーパスそのまま

            # 進捗バーの初期化
            progress_bar = tqdm(range(max_new_tokens), desc="Generating", unit="token")

            for _ in progress_bar:
                # モデルで1トークンずつ生成
                outputs = model.generate(
                    **inputs,
                    max_new_tokens=1,
                    eos_token_id=None,
                    pad_token_id=tokenizer.eos_token_id
                )
                
                # 新しく生成されたトークンをデコードして追加
                new_token = tokenizer.decode(outputs[0, -1:], skip_special_tokens=True)
                generated_text += new_token
                
                # 次回の入力には生成したテキストを追加
                inputs = tokenizer(generated_text, return_tensors="pt")

                # 進捗バーを更新
                progress_bar.set_postfix({"Output": new_token})

            return generated_text

完成関数_2(GPUとVRAMで推論バージョン)(3060でも全然イケちゃった)

## GPU-VRAMでの推論は、入力コーパス500の出力300では、4分程度かかります。
        def run_deepseek_inference(self, corpus: str) -> str:
            model_name = "deepseek-ai/deepseek-coder-1.3b-base"

            tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=True)
            tokenizer.padding_side = "left" 

            model = AutoModelForCausalLM.from_pretrained(
                model_name,
                device_map="auto",  # ← GPU使用に変更!
                torch_dtype=torch.float16,  # GPUでの高速処理に適した精度
                low_cpu_mem_usage=True,
                use_auth_token=True,
            )
            model.eval()  # 推論モードに

            generated_text = corpus
            max_new_tokens = 300

            # 初回トークン化+GPUへ移動
            inputs = tokenizer(generated_text, return_tensors="pt").to("cuda")

            progress_bar = tqdm(range(max_new_tokens), desc="Generating", unit="token")

            for _ in progress_bar:
                outputs = model.generate(
                    **inputs,
                    max_new_tokens=1,
                    eos_token_id=None,
                    pad_token_id=tokenizer.eos_token_id
                )

                # GPU → CPU に戻してデコード
                new_token = tokenizer.decode(outputs[0, -1:].cpu(), skip_special_tokens=True)
                generated_text += new_token

                # 再トークン化+GPUに再配置
                inputs = tokenizer(generated_text, return_tensors="pt").to("cuda")

                progress_bar.set_postfix({"Output": new_token})

            return generated_text

入力サイズと出力サイズのおすすめ。(chatGPT4oより。)

Screenshot from 2025-04-01 09-00-35.png

余談

尚、流石にpython3.6のtransformersライブラリ内にはDeepSeekはサポートされておらず、python3.9での実装となった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?