作者:金立彦

4月17日,OpenVINO™ 2025.1版正式发布了。我们尝个鲜,利用OpenVINO在英特尔哪吒开发套件上部署deepseek-r1-distill-Qwen-7b模型。

一、在边缘终端部署本地大模型的好处

    边缘终端,如树莓派和英特尔哪吒开发套件,通常具有较低的功耗和成本,同时具备一定的计算能力。在这些设备上部署 DeepSeek-R1 大模型,可以带来以下好处:

1. 降低云端依赖

边缘终端的本地化部署减少了对云端服务的依赖,使得设备能够在离线或网络不稳定的情况下独立运行。这对于一些需要在偏远地区或网络受限环境中使用的场景(如智能家居、工业物联网等)非常有价值。

2. 应用场景拓展  

在边缘终端部署 DeepSeek-R1 可以推动 AI 技术在更多领域的应用,如教育、开发实验、智能家居等。这不仅降低了 AI 技术的使用门槛,还促进了技术的普及。

3.隐私保护

由于数据处理完全在本地完成,边缘终端部署可以有效避免敏感信息的外泄,尤其适合对隐私有高要求的场景。

二、英特尔哪吒开发套件

英特尔哪吒开发套件搭载了英特尔N97处理器(3.6GHz),配备64GB eMMC存储和8GB LPDDR5内存。英特尔N97处理器属于 Intel Alder Lake-N 系列,4核,采用英特尔7代制程工艺,10纳米。 E-Core 的设计,专为轻量级办公、教育设备和超低功耗笔记本电脑设计,成本和功耗更低,更适合嵌入式设备。

让哪吒用上DeepSeek,让OpenVINO加速边缘计算-AI.x社区

它具有较高的性能,通过OpenVINO™ 优化,可比 Jeston TX2 性能,1.3TOPS (FP16)

同时,它又有较低的价格,Jetson TX2(8G,3480元),它只要1200元。

让哪吒用上DeepSeek,让OpenVINO加速边缘计算-AI.x社区

它的功耗只有12瓦,相当于3天3夜使用情况下,只消耗1度电都不到。

更关键的是!它还自带集成显卡,Intel UHD Graphics,我们可以在iGPU上运行大模型。

三、具体部署方案

目前暂未看到有在英特尔哪吒开发套件上部署 DeepSeek-R1 的介绍。为填补这一空白,本文介绍如何采用最新发布的OpenVINO2025.1来部署DeepSeek-R1-Distill-Qwen-7B模型。

(一)安装OpenVINO

首先是安装OpenVINO,参考官网介绍,可以采用PIP安装,也可以下载安装包。我这里采用PIP安装。

让哪吒用上DeepSeek,让OpenVINO加速边缘计算-AI.x社区

1、在Python下新建一个虚拟环境ov20251
python3 -m venv ov20251 
2、启动虚拟环境
source ov20251/bin/activate
3、安装OpenVINO
pip install openvino

    这里不指定特定版本的话,就是安装官方最新发布的2025.1版。

    4、验证

    下载完成后我们来验证一下是否安装成功OpenVINO2025.1,打开python,然后输入以下命令,查看版本信息。

    from openvino import get_version
    print(get_version())

      (二)安装OpenVINO-GenAI

      如果要快速和便捷地运行大模型,Intel还准备了OpenVino-Genai,可以实现三行代码启动一个大模型对话。

      pip install openvino-genai

        这里不指定特定版本的话,就是安装官方最新发布的2025.1版。

        这里有一个小窍门, 虽然OpenVino-GenAI的使用需要配合OpenVINO运行时,但我们可以直接安装OpenVINO-GenAI,它会自动下载安装相匹配版本的OpenVINO。

        (三)安装OpenCL ICD

        为了在 Linux 上使用 GPU 设备进行 OpenVINOuben推理,我们还需要安装 OpenCL ICD

        conda install ocl-icd-system

          (四)编写大模型对话程序

          做好以上准备工作,接下来编写一个简单的对话程序,命名为chat_genai.py

          import argparse
          import openvino_genai
          from llm_config import SUPPORTED_LLM_MODELS, DEFAULT_SYSTEM_PROMPT, DEFAULT_SYSTEM_PROMPT_CHINESE
          
          def streamer(subword):
              print(subword, end='', flush=True)
              return False
          
          def apply_chat_template(prompt, system_prompt, language="English"):  # 确保参数名与变量名一致
              """
              使用自定义的聊天模板格式化提示词
              Args:
                  prompt: 用户输入的提示
                  system_prompt: 系统提示
                  language: 语言选择
              Returns:
                  formatted_prompt: 格式化后的提示
              """
              messages = [
                  {"role": "system", "content": system_prompt},
                  {"role": "user", "content": prompt}
              ]
              
              if language == "Chinese":
                  template = SUPPORTED_LLM_MODELS["Chinese"]["DeepSeek-R1-Distill-Qwen-7B"]["genai_chat_template"]
              else:
                  template = SUPPORTED_LLM_MODELS["English"]["DeepSeek-R1-Distill-Qwen-7B"]["genai_chat_template"]
          
              formatted_prompt = ""
              for i, message in enumerate(messages):
                  if i == 0:
                      formatted_prompt += "<|begin of sentence|>"
                  if message["role"] == "system" and message["content"]:
                      formatted_prompt += message["content"]
                  elif message["role"] == "user":
                      formatted_prompt += f"<|User|>{message['content']}"
                  elif message["role"] == "assistant":
                      formatted_prompt += f"<|Assistant|>{message['content']}<|end of sentence|>"
              
              return formatted_prompt
          
          # 为 lang.value 添加默认值
          lang_value = "English"  # 默认语言设置为 English
          
          if __name__ == "__main__":
              parser = argparse.ArgumentParser(add_help=False)
              parser.add_argument('-h',
                                  '--help',
                                  action='help',
                                  help='Show this help message and exit.')
              parser.add_argument('-m',
                                  '--model_path',
                                  required=True,
                                  type=str,
                                  help='Required. model path')
              parser.add_argument('-l',
                                  '--max_sequence_length',
                                  default=256,
                                  required=False,
                                  type=int,
                                  help='Required. maximun length of output')
              parser.add_argument('-d',
                                  '--device',
                                  default='CPU',
                                  required=False,
                                  type=str,
                                  help='Required. device for inference')
              args = parser.parse_args()
          
              try:
                  print(f"正在加载模型: {args.model_path}")
                  pipe = openvino_genai.LLMPipeline(args.model_path, args.device)
                  
                  
                  # 设置生成配置
                  config = openvino_genai.GenerationConfig()
                  config.max_new_tokens = args.max_sequence_length
                  config.stop_strings = set()  # 修正为空集合(原代码会匹配空字符串)
                  
                  print("模型加载完成,开始聊天...\n")
                  
                  pipe.start_chat()
                  while True:
                      try:
                          prompt = input('问题:\n')
                          if not prompt.strip():
                              break
                              
                          system_prompt = DEFAULT_SYSTEM_PROMPT_CHINESE if lang_value == "Chinese" else DEFAULT_SYSTEM_PROMPT
                          formatted_prompt = apply_chat_template(prompt, system_prompt, language=lang_value)  # 显式指定参数名
                          pipe.get_tokenizer().set_chat_template("""
          {% for message in messages %}
          {% if loop.first %}{{ '<|begin▁of▁sentence|>' }}{% endif %}
          {% if message['role'] == 'system' and message['content'] %}{{ message['content'] }}{% endif %}
          {% if message['role'] == 'user' %}{{ '<|User|>' + message['content'] }}{% endif %}
          {% if message['role'] == 'assistant' %}{{ '<|Assistant|>' + message['content'] + '<|end▁of▁sentence|>' }}{% endif %}
          {% if loop.last and add_generation_prompt and message['role'] != 'assistant' %}{{ '<|Assistant|>' }}{% endif %}
          {% endfor %}
          """)
                          
                          print("\n生成回答中...\n")
                          pipe.generate(formatted_prompt, config, streamer)
                          print('\n----------')
                      except KeyboardInterrupt:
                          print("\n对话被用户中断")
                          break
                      except Exception as e:
                          print(f"\n错误: {e}")
                          continue
                          
                  pipe.finish_chat()
                  
              except Exception as e:
                  print(f"初始化失败: {e}")

            然后就可以启动对话了

            python3 chat_genai.py --model_path /DeepSeek-R1-Distill-Qwen-7B-sym-int4-ov --max_sequence_length 4096

            (五)Demo演示

            以下是对话视频的链接,输出速度在每秒10个token左右。

            【使用OpenVINO2025在Intel哪吒开发板上运行DeepSeek- R1-Qwen-7B蒸馏模型】​​https://www.bilibili.com/video/BV1FERhYeEdL/?share_source=copy_web&vd_source=317251442c66d2e9cefe25184cc59493&t=8​​ ​​

            结语

            当DeepSeek遇上哪吒,当OpenVINO加速边缘计算,这或许就是打开第六次康波周期"寒武纪大爆发"时刻的钥匙。

            Logo

            为开发者提供丰富的英特尔开发套件资源、创新技术、解决方案与行业活动。欢迎关注!

            更多推荐