如何使用 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, AutoModelForCausalLM

    model_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_lengthnum_return_sequencesdo_sampletop_ktop_ptemperature 等生成参数,以获得最佳结果。
  • 使用更长的上下文: 对于复杂的代码生成任务,可以尝试增加 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,并将其应用到您的实际项目中。请记住,生成的代码需要经过人工审查和测试,以确保其质量。

希望这篇文章对您有所帮助!

THE END