找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1788

积分

0

好友

241

主题
发表于 2025-12-30 04:14:08 | 查看: 27| 回复: 0

基础概念

  • FPS : Frames Per Second(每秒帧数)。在计算机视觉、视频分析和深度学习推理等领域,FPS是衡量图像或视频流处理速度的关键指标。

图1:图片检测任务的输入与输出示意图

  • Prompt(提示词):用于引导AI模型生成响应的输入文本。其主要作用是:提供上下文、给予指导、限制输出范围。
  • 7B, 8B:指模型的参数量,B表示十亿(billion)。例如7B代表模型拥有约70亿个可训练参数(即神经网络的权重和偏置)。通常,参数量越大,模型的表达能力越复杂。
  • 预训练 (Pre-Training)
    • 预训练是构建大型模型的基础,目标是利用海量数据训练出一个通用的基础模型。
    • 此过程需要收集和准备大规模的语料数据。
    • 通常消耗巨大的计算资源和时间,多在高性能计算集群上完成。
  • 微调 (Fine-Tuning)
    • 指在预训练模型的基础上进行调整,使其适应新的、特定任务。
    • 针对特定领域(如专业文本分类)时,预训练模型可能表现不佳,微调可以显著提升其在该领域的性能和准确性。
    • 优势在于高效性资源节约:相比从头训练,微调过程更快,且利用了预训练模型已学到的通用特征,降低了对计算资源的需求。
  • Hugging Face:一个提供了大量预训练机器学习模型的开源平台,模型存储在模型仓库中,同时也托管了许多公开数据集。
  • 魔塔社区 (ModelScope):由达摩院推出的国内首个中文AI模型开源社区。
    • Datasets: 提供大量公开数据集。
    • Models: 提供大量可供使用的预训练模型。
    • Docs: 提供丰富的开发工具和SDK。
  • 是否需要微调?
    • 定制化需求:生成特定领域或高度个性化的内容(如营销文案)。
    • 数据合规性:在严格监管环境下或处理敏感数据时,微调可确保模型输出符合隐私政策和行业法规。
    • 领域特定知识:使模型深度理解并生成特定业务领域的准确响应。
  • 上下文学习 (In Context Learning, ICL):通过在输入中提供示例或参考信息,引导模型完成任务,而无需更新模型参数。
  • 阈值 (Threshold):在AI人脸识别等任务中,阈值决定了系统判断两张人脸是否为同一人的严格程度。算法会将人脸转换为特征向量,通过计算相似度(如欧氏距离、余弦相似度)进行比对,阈值则设定了接受或拒绝匹配的临界点。
  • 微调(大模型场景):指对已预训练好的大语言模型,使用特定领域的小规模数据,对其全部或部分参数进行调整,以获得在该领域更优的性能。

内置NPU

以 Intel® Core™ Ultra 5 Processor 235U 为例,其NPU规格可参考:产品规格页面

图2:Intel 235U处理器NPU规格表

OpenVINO

OpenVINO GenAI 是英特尔基于 OpenVINO 工具套件构建的生成式AI开发工具库,专注于在英特尔硬件(CPU、GPU、NPU)上高效优化和部署生成式模型,以实现高性能的深度学习推理,获得快速准确的结果。

  • 可以从 Hugging Face 下载通用模型,然后通过 optimum-cli 转换为 IR 格式模型。
  • 或者直接从 Hugging Face 下载已经转换好的 OpenVINO 格式模型。

图3:OpenVINO GenAI 工作流程图

量化是一种用于减少模型存储需求和计算复杂度的技术。通过用较低精度的数据类型(如 int8, int4)表示模型的权重和激活值,量化能显著降低内存占用并提升推理速度,同时对模型精度的影响尽可能小。

  • int4:精度较低,在复杂任务或需要高精度细节时,准确性可能下降。
  • int8:能在多数任务中保留接近原始模型的性能,是性能与精度之间较好的折衷方案。

FP16BF16 都是深度学习中使用的16位浮点数表示格式。

  • FP16:由1位符号位、5位指数位和10位尾数位组成。在表达小数时精度较高,但表达大数时范围有限。
  • BF16:由1位符号位、8位指数位和7位尾数位组成。相比FP16,BF16扩大了数值表达范围,但略微降低了精度。

图4:OpenVINO 从模型到部署的全流程架构图

图5:基于CPU+GPU+NPU的硬件数字人解决方案示意图

模型转换

OpenVINO 支持将 PyTorch、TensorFlow、PaddlePaddle、ONNX 等多种格式的模型,转换为 OpenVINO IR 格式后再部署,也可直接使用原格式部署。与 OpenVINO IR 格式配合使用效果最佳,可以使用 optimum-cliOVC 命令行工具进行转换。转换好的 IR 格式模型包含 .xml(描述模型拓扑结构)和 .bin(包含权重和二进制数据)两个文件。

import openvino as ov
ov_model = ov.convert_model('yolov10b.onnx')
ov.save_model(ov_model, 'yolov10b.xml')

或者使用 OVC 命令:

ovc yolov10b.onnx

图6:OpenVINO 模型转换与优化流程示意图

下载模型

# 环境依赖
sudo apt install curl
sudo snap install aria2c
wget https://hf-mirror.com/hfd/hfd.sh
chmod a+x hfd.sh

# 设置环境变量
export HF_ENDPOINT=https://hf-mirror.com
# 下载模型
./hfd.sh dreamlike-art/dreamlike-anime-1.0

图7:使用 hfd.sh 脚本下载模型的文件列表

转换模型

使用 optimum-cli 工具进行转换。需提前准备好Python环境及相关依赖。

# 创建并激活虚拟环境
conda create -n openvino python=3.11
conda activate openvino

# 设置国内镜像加速
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/

# 安装环境依赖
pip install --pre -U openvino-genai openvino openvino-tokenizers --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly
pip install nncf
pip install optimum-intel[openvino]

# 安装其他可能需要的依赖(如特定notebook的要求)
cd /path/to/openvino_notebooks-latest/supplementary_materials/qwen2
pip install -r requirements.txt

optimum-cli export openvino 常用参数解析

  • -m–model:指定模型ID或本地路径。
  • –task:指定模型任务类型(如 text-generation, question-answering),不指定则会尝试自动推断。
  • –device:指定用于模型导出/量化的设备(如 cpu, npu)。
  • –weight-format:指定权重量化格式,如 {fp32, fp16, int8, int4}
  • –quant-mode:应用全模型量化(包括激活函数),如 {int8, ...}
  • –group-size:权重量化时的分组大小(如 --group-size 128)。
  • –dataset:用于基于数据的压缩或量化校准的数据集名称。

模型来源

转换命令示例

# 转换文本生成模型到指定目录
optimum-cli export openvino --model /path/to/DeepSeek-R1-Distill-Qwen-1.5B --task text-generation-with-past /path/to/output_dir

# 将模型转换为 int8 精度并指定在 NPU 上运行(如果支持)
optimum-cli export openvino --model Meta-Llama-3.1-8B-Instruct --task text-generation-with-past --weight-format int8 ./output_dir --device npu

# 使用 Python 转换脚本(例如针对特定模型如 Qwen)
python3 convert.py --model_id qwen/Qwen2-7B-Instruct --precision int4 --output ./output_dir --modelscope

图8:使用 optimum-cli 转换模型时的终端输出日志

图9:转换成功后的 OpenVINO IR 格式模型文件列表

参考资料:

主板GPU驱动安装

以 Ubuntu 24.04 为例,可从 Intel compute-runtime 的 GitHub Releases 页面安装最新驱动。

mkdir neo
cd neo
# 下载所有 *.deb 包 (此处为示例,版本号请以最新release为准)
wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-core-2_2.22.2+20121_amd64.deb
wget https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-opencl-2_2.22.2+20121_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/25.44.36015.5/intel-opencl-icd_25.44.36015.5-0_amd64.deb
# ... 下载其他必要的包

# 安装所有包
sudo dpkg -i *.deb
# 若安装出错,可能需要安装依赖,例如:
sudo apt install ocl-icd-libopencl1

# 重启后检查驱动
sudo dmesg | grep gpu

主板NPU驱动安装

驱动项目地址: https://github.com/intel/linux-npu-driver

# 移除旧版本驱动包(如有)
sudo dpkg --purge --force-remove-reinstreq intel-driver-compiler-npu intel-fw-npu intel-level-zero-npu intel-level-zero-npu-dbgsym

# 下载并解压驱动包 (以 Ubuntu 24.04 为例)
wget https://github.com/intel/linux-npu-driver/releases/download/v1.26.0/linux-npu-driver-v1.26.0.20251125-19665715237-ubuntu2404.tar.gz
tar -xf linux-npu-driver-v1.26.0.20251125-19665715237-ubuntu2404.tar.gz
cd <解压后的目录>

# 安装依赖
sudo apt update
sudo apt install libtbb12

# 安装所有驱动包
sudo dpkg -i *.deb

# 检查并安装 Level Zero 运行时(如未安装)
dpkg -l level-zero
# 如果未安装,则下载对应版本安装,例如 Ubuntu 24.04:
wget https://github.com/oneapi-src/level-zero/releases/download/v1.24.2/level-zero_1.24.2+u24.04_amd64.deb
sudo dpkg -i level-zero*.deb

图10:使用 dpkg 检查 level-zero 运行时的安装状态

重启系统后验证:

# 检查 NPU 设备文件
ls /dev/accel/accel0
# 查看内核日志中的 VPU/NPU 信息
sudo dmesg | grep vpu

图11:系统重启后,dmesg 中显示的 NPU 设备初始化信息

开发环境

通过 PIP 安装 OpenVINO,并验证可用设备中是否包含 NPU。
参考:OpenVINO 官方下载页面

图12:OpenVINO 官方下载页面选择界面

# 第 1 步:创建虚拟环境。
python3 -m venv openvino_env
# 第 2 步:激活虚拟环境
source openvino_env/bin/activate
# 第 3 步:升级 pip。
python -m pip install --upgrade pip
# 第 4 步:安装 OpenVINO 基础包。
pip install openvino==2025.4.0

# 查看可用设备
python -c "from openvino import Core; print(Core().available_devices)"

图13:运行代码验证 OpenVINO 可用的设备列表(显示 CPU 和 NPU)

若要使用对话生成模型(如 DeepSeek),需额外安装 openvino-genai

# 在已激活的 openvino_env 环境中执行
pip install openvino-genai==2025.4.0

模型部署

基础推理流程示例:

  1. 导入库并创建核心对象

    import openvino as ov
    core = ov.Core()
  2. 加载并编译模型

    model = core.read_model(model="model.xml") # 模型路径
    # 第二个参数为 device_name,例如 "CPU", "GPU", "NPU" 或 "AUTO"
    compiled_model = core.compile_model(model, "AUTO")
  3. 获取模型输入/输出信息

    inputs = compiled_model.inputs
    outputs = compiled_model.outputs
    # 或通过索引获取
    input_layer = compiled_model.input(0)
    output_layer = compiled_model.output(0)
    # 获取形状和数据类型
    input_shape = input_layer.shape
    data_type = input_layer.get_element_type()

图14:模型输入与输出格式说明图

  1. 创建推理请求并进行推理
    infer_request = compiled_model.create_infer_request()
    # 设置输入数据 (假设 input_data 是预处理后的 NCHW 格式数据)
    input_tensor = ov.Tensor(array=input_data, shared_memory=True)
    infer_request.set_input_tensor(input_tensor)
    # 执行异步推理
    infer_request.start_async()
    infer_request.wait() # 等待推理完成
    # 获取输出结果
    output_tensor = infer_request.get_output_tensor()
    output_data = output_tensor.data
    # 对 output_data 进行后处理...

调用 DeepSeek 实时对话模型

以下是一个简化的示例,展示如何加载模型并进行对话生成,支持在 NPU 和 CPU 间自动回退。

#!/usr/bin/env python3
import time
import openvino as ov
import openvino_genai as ov_genai
from transformers import AutoTokenizer
from pathlib import Path

class SimpleNPUModelLoader:
    """简化的NPU/CPU模型加载与推理类"""

    def __init__(self, model_path):
        self.model_path = Path(model_path)
        self.genai_pipe = None
        self.tokenizer = None
        self.use_npu = True

    def check_npu_availability(self):
        """检查NPU可用性"""
        print("🔍 检查NPU可用性...")
        try:
            core = ov.Core()
            available_devices = core.available_devices
            if "NPU" in available_devices:
                device_name = core.get_property("NPU", "FULL_DEVICE_NAME")
                print(f"   ✅ NPU可用: {device_name}")
                return True
            else:
                print("   ❌ NPU设备不可用")
                return False
        except Exception as e:
            print(f"   ❌ NPU检查失败: {e}")
            return False

    def load_model(self):
        """加载模型到可用设备(NPU优先,失败则回退CPU)"""
        print("🚀 开始加载模型...")
        npu_available = self.check_npu_availability()

        if not npu_available:
            print("   🔄 NPU不可用,回退到CPU...")
            device = "CPU"
            self.use_npu = False
        else:
            device = "NPU"
            self.use_npu = True

        try:
            scheduler_config = ov_genai.SchedulerConfig()
            scheduler_config.cache_size = 2  # 缓存大小设为2GB
            print(f"   📦 使用OpenVINO GenAI加载模型到{device}...")
            self.genai_pipe = ov_genai.LLMPipeline(
                str(self.model_path),
                device,
                scheduler_config=scheduler_config,
            )
            print("   📝 加载tokenizer...")
            self.tokenizer = AutoTokenizer.from_pretrained(
                str(self.model_path),
                trust_remote_code=True
            )
            print(f"   ✅ 模型成功加载到{device}设备")
            return True
        except Exception as e:
            print(f"   ❌ 模型加载失败: {e}")
            # NPU加载失败,尝试回退CPU
            if device == "NPU":
                print("   🔄 NPU加载失败,尝试CPU...")
                try:
                    self.genai_pipe = ov_genai.LLMPipeline(str(self.model_path), "CPU")
                    self.use_npu = False
                    print("   ✅ 模型成功加载到CPU设备")
                    return True
                except Exception as cpu_e:
                    print(f"   ❌ CPU加载也失败: {cpu_e}")
            return False

    def streamer(self, subword):
        """流式输出回调函数"""
        print(subword, end='', flush=True)
        return False

    def generate_text(self, prompt):
        """生成文本"""
        if self.genai_pipe is None:
            raise RuntimeError("模型未加载")
        try:
            config = ov_genai.GenerationConfig()
            config.max_new_tokens = 4096
            config.stop_strings = set()  # 设置停止词
            response = self.genai_pipe.generate(prompt, config, streamer=self.streamer)
            return response
        except Exception as e:
            print(f"❌ 文本生成失败: {e}")
            return None

def main():
    """主函数"""
    print("🎉 Intel NPU模型加载和推理测试")
    print("=" * 50)
    # 模型路径 - 请根据实际情况修改
    model_path = "path/to/your/openvino_model_dir"
    loader = SimpleNPUModelLoader(model_path)

    if loader.load_model():
        device_name = "NPU" if loader.use_npu else "CPU"
        print(f"\n🧪 开始测试推理 (设备: {device_name})...")
        test_prompt = "你好,请介绍一下自己。"
        print(f"📝 提示: {test_prompt}")
        print("🤖 AI: ", end="")
        start_time = time.time()
        response = loader.generate_text(test_prompt)
        end_time = time.time()
        print(f"\n⏱️  推理时间: {(end_time - start_time):.2f}秒")

        # 进入简单交互循环
        print("\n💬 进入交互模式(输入'quit'退出):")
        while True:
            user_input = input("\n👤 您: ").strip()
            if user_input.lower() in ['quit', 'exit', '退出']:
                break
            if user_input:
                print("🤖 AI: ", end="")
                loader.generate_text(user_input)
                print()
    else:
        print("❌ 模型加载失败,程序退出")
    print("\n👋 程序结束")

if __name__ == "__main__":
    main()

图15:LLM 文本生成流程示意图

安装报错处理

系统问题

在 Ubuntu 22.04 上安装 Intel GPU 驱动可能遇到问题,升级到 Ubuntu 24.04.3 或更新版本通常可以解决。

编译环境

错误信息:None of PyTorch, TensorFlow >= 2.0, or Flax have been found...
该错误表明当前 Python 环境中缺少 Hugging Face Transformers 库所需的深度学习后端框架。

解决方案:安装至少一个深度学习框架。

# 安装 PyTorch (推荐) 或 TensorFlow
pip install torch
# 或
pip install tensorflow
# 验证安装
python -c "import tensorflow as tf; print(tf.__version__)"

图16:终端中验证 TensorFlow 版本成功安装

实践示例

YOLO 模型转换与调用

将 Ultralytics YOLO 模型转换为 OpenVINO 格式,并在推理时自动判断。

import openvino as ov
from ultralytics import YOLO
from pathlib import Path

MODEL_NAME = "yolov11n"
PT_MODEL_PATH = f"path/to/{MODEL_NAME}.pt"
IR_MODEL_DIR = Path(f"path/to/{MODEL_NAME}_openvino_model")
IR_MODEL_PATH = IR_MODEL_DIR / f"{MODEL_NAME}.xml"

def load_or_export_openvino_model() -> ov.CompiledModel:
    """加载或导出 YOLO 模型的 OpenVINO IR 格式"""
    model = YOLO(PT_MODEL_PATH)
    if not IR_MODEL_PATH.exists():
        print("转换后的openvino模型不存在,进行模型转换...")
        model.export(format="openvino", dynamic=True, half=True)
    core = ov.Core()
    ir_model = core.read_model(IR_MODEL_PATH)
    print("模型加载完毕")
    # 指定推理设备,如 "CPU", "GPU", "NPU"
    return core.compile_model(ir_model, device_name="NPU")

# 使用编译后的模型
compiled_model = load_or_export_openvino_model()
# 后续可使用 compiled_model 进行推理

文本生成(带草稿模型加速)

使用 Speculative Decoding(推测解码)技术,结合小型草稿模型加速大模型文本生成。

import openvino_genai

def streamer(subword):
    """流式输出回调"""
    print(subword, end='', flush=True)
    return openvino_genai.StreamingStatus.RUNNING

def infer_with_draft(main_model_dir: str, draft_model_dir: str, prompt: str):
    main_device = 'CPU'  # 或 'GPU', 'NPU'
    draft_device = 'CPU'

    # 配置缓存
    scheduler_config = openvino_genai.SchedulerConfig()
    scheduler_config.cache_size = 2  # GB

    # 初始化草稿模型(FastDraft)
    draft_model = openvino_genai.draft_model(draft_model_dir, draft_device)

    # 创建带草稿模型的推理管道
    pipe = openvino_genai.LLMPipeline(
        main_model_dir,
        main_device,
        scheduler_config=scheduler_config,
        draft_model=draft_model
    )

    # 配置生成参数,启用推测解码
    config = openvino_genai.GenerationConfig()
    config.max_new_tokens = 100
    config.num_assistant_tokens = 5  # 草稿模型每次预测的token数

    # 生成文本
    pipe.generate(prompt, config, streamer)

# 使用示例
infer_with_draft(
    "path/to/Meta-Llama-3.1-8B-Instruct-OV",
    "path/to/Llama-3.1-8B-Instruct-FastDraft-150M-int8-OV",
    "The Sun is yellow because"
)

视频目标检测推理

使用转换后的 YOLO OpenVINO 模型对摄像头或视频文件进行实时目标检测。

import cv2
import numpy as np
import time
import collections
from pathlib import Path

def run_video_inference(det_model, source=0, flip=True, width=None, save_video=False, output_dir="./results"):
    """
    使用 OpenVINO YOLO 模型进行视频目标检测
    det_model: 已加载的 YOLO 模型对象 (来自 ultralytics.YOLO)
    source: 视频文件路径或摄像头索引
    """
    cap = cv2.VideoCapture(source)
    if not cap.isOpened():
        print(f"无法打开视频源: {source}")
        return

    Path(output_dir).mkdir(parents=True, exist_ok=True)
    out_writer = None
    processing_times = collections.deque(maxlen=200)  # 用于计算平均FPS

    try:
        while True:
            ret, frame = cap.read()
            if not ret:
                break
            if flip:
                frame = cv2.flip(frame, 1)
            if width:
                scale = width / frame.shape[1]
                frame = cv2.resize(frame, None, fx=scale, fy=scale)

            # 推理
            start_time = time.time()
            results = det_model(frame, verbose=False)
            stop_time = time.time()

            # 绘制结果
            annotated_frame = results[0].plot()

            # 计算并显示FPS
            processing_times.append(stop_time - start_time)
            fps = len(processing_times) / sum(processing_times) if processing_times else 0
            cv2.putText(annotated_frame, f"FPS: {fps:.1f}", (10, 30),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

            cv2.imshow('YOLO OpenVINO Detection', annotated_frame)
            if cv2.waitKey(1) & 0xFF == 27:  # ESC 退出
                break
    finally:
        cap.release()
        cv2.destroyAllWindows()
        if out_writer:
            out_writer.release()

# 假设 det_model 已通过之前的函数 build_ultralytics_model() 加载
run_video_inference(det_model, source=0, width=1280)

文本转图像 (Text-to-Image)

使用 Stable Diffusion 类模型(如 dreamlike-anime-1.0)生成图像。

步骤1:转换模型

optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --device npu ./dreamlike_anime_ov

步骤2:Python 代码调用

import openvino_genai as ov_genai
from PIL import Image
import sys
from tqdm import tqdm

model_dir = "./dreamlike_anime_ov"
device = "NPU"  # 或 "CPU", "GPU"
num_inference_steps = 20
prompt = "cyberpunk cityscape at dusk, cinematic lighting"

# 初始化生成器和流水线
random_generator = ov_genai.TorchGenerator(42) # 固定随机种子
if device != "NPU":
    pipe = ov_genai.Text2ImagePipeline(model_dir, device)
else:
    # NPU设备可能需要先 reshape 再 compile
    pipe = ov_genai.Text2ImagePipeline(model_dir)
    pipe.reshape(1, 512, 512, pipe.get_generation_config().guidance_scale)
    pipe.compile(device)

# 带进度条的回调函数
pbar = tqdm(total=num_inference_steps, desc="Generating")
def callback(step, num_steps, latent):
    pbar.update(1)
    sys.stdout.flush()
    return False

# 生成图像
image_tensor = pipe.generate(
    prompt,
    width=512,
    height=512,
    num_inference_steps=num_inference_steps,
    generator=random_generator,
    callback=callback
)
pbar.close()

# 转换为PIL图像并显示/保存
image = Image.fromarray(image_tensor.data[0])
image.show()
# image.save("output.png")

实用工具与资源

# 安装 Open Model Zoo 工具包,包含模型下载、优化等自动化脚本
pip install openvino-dev

参考资料




上一篇:Rockchip NPU实战:基于RKNN/RKLLM部署DeepSeek-R1与YOLOv5模型指南
下一篇:RK3568调试笔记:解决Linux USB Camera与WIFI连接常见问题
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 18:32 , Processed in 0.302912 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表