如何使用 DeepSeek-R1?完整教程与示例
DeepSeek-Coder 系列模型 DeepSeek-R1 完整使用教程与示例
DeepSeek-Coder 系列是由 DeepSeek 公司开发的专注于代码生成和编程相关任务的大型语言模型(LLM)。其中,DeepSeek-R1 是该系列中的一个重要模型,它在代码补全、代码生成、代码翻译、代码注释、以及与编程相关的自然语言问答等方面表现出色。本文将详细介绍如何使用 DeepSeek-R1,包括环境配置、模型加载、不同任务的示例代码,以及一些高级技巧。
1. 环境配置
在使用 DeepSeek-R1 之前,我们需要配置一个合适的 Python 环境。推荐使用 Anaconda 或 Miniconda 来管理环境。
-
创建虚拟环境(可选,但强烈推荐):
bash
conda create -n deepseek python=3.9
conda activate deepseek -
安装 PyTorch:
DeepSeek-R1 基于 PyTorch 框架。请根据您的 CUDA 版本安装合适的 PyTorch。您可以在 PyTorch 官网(https://pytorch.org/get-started/locally/)找到安装命令。例如,对于 CUDA 11.8:
bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -
安装 Transformers 库:
bash
pip install transformers
如果在中国大陆地区,可以使用清华大学的镜像源加速下载
bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple transformers -
安装其他依赖项 (可能需要):
bash
pip install sentencepiece accelerate
如果在中国大陆地区,可以使用清华大学的镜像源加速下载
bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sentencepiece accelerate
sentencepiece
用于处理文本分词,accelerate
可用于模型加速
2. 模型加载
DeepSeek-Coder 系列模型托管在 Hugging Face Model Hub 上。我们可以使用 Transformers 库轻松加载这些模型。
-
基础加载方式:
```python
from transformers import AutoTokenizer, AutoModelForCausalLMmodel_name = "deepseek-ai/deepseek-coder-1.3b-base" # 或其他 DeepSeek-Coder 模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)将模型移动到 GPU (如果可用)
if torch.cuda.is_available():
model = model.to("cuda")
如果在中国大陆地区,可以使用ModelScope,更方便的加载模型
python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-1.3b-base"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
```model_name
: 指定要加载的模型名称。您可以在 Hugging Face Model Hub 上搜索 "deepseek-coder" 找到所有可用的模型,例如:deepseek-ai/deepseek-coder-1.3b-base
: 1.3B 参数的基础模型。deepseek-ai/deepseek-coder-6.7b-base
: 6.7B 参数的基础模型。deepseek-ai/deepseek-coder-33b-base
: 33B 参数的基础模型。deepseek-ai/deepseek-coder-1.3b-instruct
: 1.3B 参数的指令微调模型。deepseek-ai/deepseek-coder-6.7b-instruct
: 6.7B 参数的指令微调模型。deepseek-ai/deepseek-coder-33b-instruct
: 33B 参数的指令微调模型。deepseek-ai/deepseek-coder-7b-instruct-v1.5
: 7B 参数的指令微调模型。deepseek-ai/deepseek-coder-7b-base-v1.5
: 7B 参数的基础模型。
AutoTokenizer
: 用于将文本转换为模型可以理解的 token ID。AutoModelForCausalLM
: 用于加载因果语言模型(Causal LM),这类模型擅长生成文本序列。.to("cuda")
: 将模型加载到 GPU 上,以加快推理速度。
-
使用半精度 (FP16) 加载 (推荐):
为了减少显存占用并提高推理速度,可以使用半精度(FP16)加载模型:
python
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
使用ModelScope,更方便的加载模型
python
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
注意:并非所有 GPU 都支持 FP16。如果您的 GPU 不支持,请使用 FP32(默认)。 -
指定设备 (可选):
如果您有多个 GPU,可以指定模型加载到哪个 GPU 上:
python
model = model.to("cuda:0") # 加载到第一个 GPU
model = model.to("cuda:1") # 加载到第二个 GPU
3. 基本文本生成
加载模型后,我们可以开始生成文本。
```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name = "deepseek-ai/deepseek-coder-1.3b-instruct" # 使用指令微调模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
if torch.cuda.is_available():
model = model.to("cuda")
prompt = "写一段Python代码,实现快速排序算法:"
inputs = tokenizer(prompt, return_tensors="pt")
将输入移动到 GPU (如果可用)
if torch.cuda.is_available():
inputs = inputs.to("cuda")
outputs = model.generate(**inputs, max_length=512, num_return_sequences=1, no_repeat_ngram_size=2)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-1.3b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = "写一段Python代码,实现快速排序算法:"
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=512)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
tokenizer(prompt, return_tensors="pt")
: 将文本 prompt 编码为 PyTorch tensors。model.generate(...)
: 生成文本。max_length
: 生成的最大长度(包括 prompt)。num_return_sequences
: 生成多少个不同的序列。no_repeat_ngram_size
: 防止生成重复的 n-gram(这里设置为 2,防止重复的 bigram)。do_sample=True
: 使用采样方法生成文本,增加多样性。top_k=50
: 从概率最高的 50 个 token 中采样。top_p=0.95
: 从累积概率达到 0.95 的 token 中采样。temperature=0.7
: 控制生成文本的随机性(越高越随机)。
tokenizer.decode(...)
: 将生成的 token ID 解码为文本。skip_special_tokens=True
: 跳过特殊 token(如<|endoftext|>
)。
4. 代码补全
DeepSeek-R1 最强大的功能之一是代码补全。
python
prompt = """
def factorial(n):
\"\"\"
Calculate the factorial of a non-negative integer.
\"\"\"
if n == 0:
return 1
else:
return n * factorial(
"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=128, num_return_sequences=1,no_repeat_ngram_size=3, do_sample=True, top_k=50, top_p=0.95, temperature=0.7)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
```python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-7b-instruct-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = """
def factorial(n):
\"\"\"
Calculate the factorial of a non-negative integer.
\"\"\"
if n == 0:
return 1
else:
return n * factorial(
"""
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=128)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
在这个例子中,我们提供了一个函数定义的开头部分,模型会自动补全剩余的代码。
5. 代码生成
除了补全,我们还可以让 DeepSeek-R1 从头开始生成代码。
```python
prompt = "用 Python 写一个函数,计算斐波那契数列的第 n 项:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=256, num_return_sequences=1, do_sample=True, top_k=50, top_p=0.95, temperature=0.7)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-7b-instruct-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = "用 Python 写一个函数,计算斐波那契数列的第 n 项:"
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=256)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
6. 代码翻译
DeepSeek-R1 还可以进行代码翻译,例如将 Python 代码翻译成 JavaScript 代码。
```python
prompt = """
将以下 Python 代码翻译成 JavaScript 代码:
def greet(name):
print(f"Hello, {name}!")
"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=256, num_return_sequences=1)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-7b-instruct-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = """
将以下 Python 代码翻译成 JavaScript 代码:
def greet(name):
print(f"Hello, {name}!")
"""
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=256)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
7. 代码注释
DeepSeek-R1 可以为代码添加注释。
```python
prompt = """
为以下 Python 代码添加注释:
def add(x, y):
return x + y
"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=256, num_return_sequences=1)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-7b-instruct-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = """
为以下 Python 代码添加注释:
def add(x, y):
return x + y
"""
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=256)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
8. 编程相关问答
DeepSeek-R1 还可以回答与编程相关的问题。
python
prompt = "Python 中的列表推导式是什么?"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=256, num_return_sequences=1, do_sample=True, top_k=50, top_p=0.95, temperature=0.7)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
使用ModelScope,更方便的加载模型
```python
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "deepseek-ai/deepseek-coder-7b-instruct-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).half().cuda()
prompt = "Python 中的列表推导式是什么?"
messages = [
{"role": "user", "content": prompt}
]
input_ids = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True,return_tensors="pt").to(model.device)
outputs = model.generate(input_ids, max_new_tokens=256)
response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
print(response)
```
9. 高级技巧
- 调整生成参数: 根据您的任务和需求,仔细调整
max_length
、num_return_sequences
、do_sample
、top_k
、top_p
和temperature
等生成参数,以获得最佳结果。 - 使用更长的上下文: 对于复杂的代码生成任务,可以尝试增加 prompt 的长度,提供更详细的上下文信息。
- 分步生成: 对于复杂的代码生成任务,可以将任务分解为多个步骤,逐步引导模型生成代码。例如,先生成函数签名,再生成函数体。
- 结合人工审查: 虽然 DeepSeek-R1 在代码生成方面表现出色,但生成的代码仍然需要人工审查和测试,以确保其正确性和安全性。
- 利用Beam Search: Beam Search是一种常用的解码策略,通过在每个时间步保留多个候选序列来提高生成质量,可以尝试设置
num_beams
参数来启用Beam Search.
10. 常见问题解答 (FAQ)
-
Q: DeepSeek-R1 支持哪些编程语言?
A: DeepSeek-R1 主要支持 Python、JavaScript、Java、C++、C#、Go 等主流编程语言。
-
Q: DeepSeek-R1 生成的代码是否总是正确的?
A: 不一定。DeepSeek-R1 是一种基于统计学习的模型,它生成的代码可能存在错误或漏洞。因此,生成的代码需要经过人工审查和测试。
-
Q: 如何提高 DeepSeek-R1 生成代码的质量?
A: 可以尝试以下方法:
* 提供更清晰、更详细的 prompt。
* 调整生成参数。
* 使用指令微调模型。
* 分步生成。
* 结合人工审查。 -
Q: 我可以微调 DeepSeek-R1 吗?
A: 可以。 DeepSeek 团队提供了微调的脚本和指南。 你可以使用自己的数据集对 DeepSeek-R1 进行微调,以适应特定的任务或领域。但微调需要一定的计算资源和专业知识。
总结
DeepSeek-R1 是一个功能强大的代码生成模型,它可以帮助开发者提高编程效率,完成各种与编程相关的任务。通过本文提供的详细教程和示例,您可以快速上手使用 DeepSeek-R1,并将其应用到您的实际项目中。请记住,生成的代码需要经过人工审查和测试,以确保其质量。
希望这篇文章对您有所帮助!