pang19823 2024-03-05 15:42 采纳率: 0%
浏览 156
已结题

使用C# BERT NLP深度学习和ONNX Runtime进行本地部署推理

GitHub 上的 onnx/models 仓库中,验证过的文本机器理解模型(BERT-SQuAD)的主分支模型
onnx模型下载地址:
https://github.com/onnx/models/tree/main/validated/text/machine_comprehension/bert-squad/model

使用 C# 和 onnxruntime 进行 BERT NLP 推理
Inference BERT NLP with C# | onnxruntime

https://onnxruntime.ai/docs/tutorials/csharp/bert-nlp-csharp-console-app.html#inference-with-c

根据上述链接中的模型和推理范例,做成一个完整的推理项目,在本地完成部署推理
1.输入内容
2.点击推理
3.返回推理结果

img

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-05 15:42
    关注

    引自免费微信小程序:皆我百晓生

    为了帮助您在本地部署和使用C#与ONNX Runtime进行BERT NLP推理,以下是一个详细的步骤指南以及相关代码片段。请注意,由于实际项目开发中涉及的文件路径、环境配置等因素无法在此详尽,请根据实际情况调整。

    1. 准备工作

      • 安装.NET Core SDK(确保版本兼容ONNX Runtime)
      • 安装ONNX Runtime NuGet包到您的C#项目:dotnet add package Microsoft.ML.OnnxRuntime
      • 模型下载地址下载所需的BERT-SQuAD模型文件(.onnx格式)
    2. 创建C#项目结构: 创建一个控制台应用程序,并导入必要的命名空间:

    using System;
    using System.IO;
    using Microsoft.ML.OnnxRuntime;
    
    1. 加载ONNX模型: 加载下载好的BERT模型文件:
    string modelPath = @"path/to/bert.onnx";
    var sessionOptions = new SessionOptions { GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_ALL };
    var session = new InferenceSession(modelPath, sessionOptions);
    
    1. 处理输入数据: BERT-SQuAD模型通常需要两个输入,一个是问题(question),另一个是上下文文本(context)。将它们转换为ONNX接受的数据格式并创建对应的ValueInfoProto实例:
    // 假设我们有如下问题和上下文文本
    string question = "What is 5G?";
    string context = "5G...4G+HD201:26";
    
    // 对输入进行预处理(这里仅做示例,实际需要遵循BERT模型要求的tokenizer规则)
    var inputIds = BertTokenizer.Preprocess(question, context); // 这部分需要实现BERT的tokenizer逻辑
    var tokenTypeIds = ...; // Segment IDs
    var attentionMask = ...; // Attention mask
    
    // 转换为TensorData
    var inputs = new List<NamedOnnxValue>()
    {
        NamedOnnxValue.CreateFromTensor("input_ids", new DenseTensor<int>(inputIds)),
        NamedOnnxValue.CreateFromTensor("token_type_ids", new DenseTensor<int>(tokenTypeIds)),
        NamedOnnxValue.CreateFromTensor("attention_mask", new DenseTensor<int>(attentionMask))
    };
    
    1. 执行推理: 使用ONNX Runtime进行推理:
    var results = session.Run(inputs);
    
    // 获取输出结果,解码为实际答案
    var output = results.First().AsTensor<float>();
    // 这里同样需要对输出结果进行后处理以得到最终答案,这部分逻辑依赖于SQuAD任务的具体要求
    var answer = DecodeAnswer(output);
    
    1. 实现UI交互: 为了实现点击按钮完成推理的功能,您可以使用Console.ReadLine()获取用户输入,或者在WPF或WinForms应用中添加界面元素。以下是一个简单的Console应用示例:
    while (true)
    {
        Console.WriteLine("请输入问题:");
        string question = Console.ReadLine();
        Console.WriteLine("请输入上下文文本:");
        string context = Console.ReadLine();
    
        // 执行上述4-5步的推理过程
    
        Console.WriteLine($"推理结果: {answer}");
    }
    

    请根据实际需求自行填充tokenizer和decodeAnswer函数的内容,这两个函数分别负责将原始文本转换成模型所需的输入形式,以及将模型输出解码为可读的答案。此外,由于篇幅限制,这里未提供完整的tokenizer和decoder实现,您可能需要参考BERT的相关文档和源码来完成这部分工作。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月6日
  • 创建了问题 3月5日