DeepSeek ç²¾ç®çè天æ¨çèæ¬ | AIçæåç¿»è¯
#!/usr/bin/env python3
"""
DeepSeek-V2-Lite-Chat 4-bité忍çã
éå12GBæ¾åï¼RTX 4070ï¼ã
ç¨æ³ï¼
python run_lite.py # 交äºå¼å¯¹è¯
python run_lite.py -p "卿¤è¾å
¥æç¤º" # 忬¡æç¤º
"""
import argparse
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
MODEL_PATH = "/mnt/data/models/DeepSeek-V2-Lite-Chat"
def load_model():
"""å è½½4-bité忍¡åã"""
print("æ£å¨å è½½tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
print("æ£å¨ä»¥4-bitæ¹å¼å 载模å...")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True,
torch_dtype=torch.bfloat16,
)
mem_gb = torch.cuda.memory_allocated() / 1024**3
print(f"模åå è½½å®æãGPUæ¾å使ç¨éï¼{mem_gb:.1f} GB")
return model, tokenizer
def generate(model, tokenizer, prompt, max_new_tokens=512):
"""çæåå¤ã"""
messages = [{"role": "user", "content": prompt}]
input_text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
)
response = tokenizer.decode(
outputs[0][inputs["input_ids"].shape[1] :], skip_special_tokens=True
)
return response
def interactive(model, tokenizer):
"""交äºå¼å¯¹è¯å¾ªç¯ã"""
print("\nDeepSeek-V2-Lite-Chat (4-bit) â äº¤äºæ¨¡å¼")
print("è¾å
¥'quit'éåºï¼è¾å
¥'clear'éç½®åå²è®°å½ã\n")
while True:
try:
user_input = input("ä½ ï¼").strip()
except (EOFError, KeyboardInterrupt):
print("\nåè§ï¼")
break
if not user_input:
continue
if user_input.lower() == "quit":
break
if user_input.lower() == "clear":
print("ä¸ä¸æå·²æ¸
é¤ã\n")
continue
response = generate(model, tokenizer, user_input)
print(f"\nDeepSeekï¼{response}\n")
def main():
parser = argparse.ArgumentParser(description="DeepSeek-V2-Liteæ¨ç")
parser.add_argument("-p", "--prompt", help="忬¡æç¤ºæ¨¡å¼")
parser.add_argument(
"-n", "--max-tokens", type=int, default=512, help="æå¤§æ°çætokenæ°"
)
args = parser.parse_args()
model, tokenizer = load_model()
if args.prompt:
response = generate(model, tokenizer, args.prompt, args.max_tokens)
print(response)
else:
interactive(model, tokenizer)
if __name__ == "__main__":
main()