随着AI在软件应用中的兴起和市场需求的快速增长,数据科学家和ML工程师在企业环境中扩展ML模型部署时面临着多样化的挑战。加上将AI工作流与现有软件开发流程集成的复杂性,以及在各种环境中灵活、安全部署的应用需求,使问题变得更加复杂。这种复杂性的叠加可能导致部署周期漫长且成本高昂,甚至许多情况下会导致AI应用计划的失败。
NVIDIA NIM 有助于克服构建 AI 应用程序的挑战,为开发者提供行业标准 API,用于构建功能强大的 Copilot、聊天机器人和 AI 助手,同时使 IT 和 DevOps 团队能够轻松地在自己的托管环境中自行托管 AI 模型。NIM 基于可靠的基础构建,包括 TensorRT、TensorRT-LLM 和 PyTorch 等推理引擎,旨在促进大规模无缝 AI 推理。
利用NVIDIA加速计算基础设施来优化AI应用性能,提供低延迟和高吞吐量,以便在大规模生产环境中实现具有可扩展性的LLM部署。
1. NIM平台搭建“基于NVIDIA NIM 平台的知识问答系统:
1.1 与流行库无缝兼容:
只需几行代码,即可使用现有工具和应用程序中的NVIDIA API。
1.2 使用你喜欢的工具:
使用您最喜欢的大型语言模型(LLM)编程框架,包括LangChain和LlamaIndex,轻松地将最新的AI模型集成到您的应用程序中,可以体验领先的开放式模型。
1.3 使用NVIDIA NIM加速您的AI部署:
作为NVIDIA AI Enterprise的一部分,NVIDIA NIM是一组易于使用的推理微服务,用于加速基础模型在任何云或数据中心的部署,并帮助保护您的数据安全。
1.4 部署NIM:
使用单个命令为您的模型部署NIM。您还可以使用微调的模型轻松运行NIM。运行推理,使用基于NVIDIA加速基础架构的最佳运行时引擎启动并运行NIM。构建,开发人员只需几行代码即可集成自托管NIM端点。
然后我们把下面的代码复制粘贴到一开始创建的 Python 文件中,例如“nim_test.py”:
# -*- coding: utf-8-*-
# 导入必要的库
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings, ChatNVIDIA
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores importFAISSfrom langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import chain
import os
import gradio as gr
from datetime import datetime
# Even if you do not know the full answer, generate a one-paragraph hypothetical answer to the below question in Chinese
# 定义假设性回答模板
hyde_template ="""Even if you do not know the full answer, generate a one-paragraph hypothetical answer to the below question:{question}"""
# 定义最终回答模板
template ="""Answer the question based only on the following context:{context}
Question:{question}"""
# 定义函数来处理问题
def process_question(url, api_key, model_name, question):
# 初始化加载器并加载数据
loader =WebBaseLoader(url)
docs = loader.load()
# 设置环境变量
os.environ['NVIDIA_API_KEY']= api_key
# 初始化嵌入层
embeddings =NVIDIAEmbeddings()
text_splitter =RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)
vector =FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever()
# 初始化模型
model =ChatNVIDIA(model=model_name)
# 创建提示模板
hyde_prompt = ChatPromptTemplate.from_template(hyde_template)
hyde_query_transformer = hyde_prompt | model |StrOutputParser()
# 定义检索函数
@chain
def hyde_retriever(question):
hypothetical_document = hyde_query_transformer.invoke({"question": question})return retriever.invoke(hypothetical_document)
# 定义最终回答链
prompt = ChatPromptTemplate.from_template(template)
answer_chain = prompt | model |StrOutputParser()
@chain
def final_chain(question):
documents = hyde_retriever.invoke(question)
response =""for s in answer_chain.stream({"question": question,"context": documents}):
response += s
return response
# 调用最终链获取答案
returnstr(datetime.now())+final_chain.invoke(question)
# 定义可用的模型列表
models =["mistralai/mistral-7b-instruct-v0.2","meta/llama-3.1-405b-instruct"]
# 启动Gradio应用
iface = gr.Interface(
fn=process_question,
inputs=[
gr.Textbox(label="输入需要学习的网址"),
gr.Textbox(label="NVIDIA API Key"),
gr.Dropdown(models, label="选择语言模型"),
gr.Textbox(label="输入问题")],
outputs="text",
title="网页知识问答系统")
# 启动Gradio界面
iface.launch()
这里需要安装一下包和依赖:
pip install langchain_nvidia_ai_endpoints langchain-community langchain-text-splitters faiss-cpu gradio==3.50.0 setuptools beautifulsoup4
在浏览器中输入127.0.0.1之后,可以打开一个网址,先选择llama的模型,并输入问题“告诉我怎么样才能学好鸿蒙技术”,可以看到给我列出了一些信息,表示将这个网站进行了一下分析,然后通过AI的技术栈来获取知识,但是发现好像要60s才能解析出来。
我们可以看一下另外一个模型mistral,同样的问题,我们看到回答的信息相对要多一点,不过是英文的返回。
2. 体验一下API的Nim平台模型:
通过shell来使用一下api接口形式:
invoke_url='https://integrate.api.nvidia.com/v1/chat/completions'
authorization_header='Authorization: Bearer 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'
accept_header='Accept: application/json'
content_type_header='Content-Type: application/json'
data=$'{"messages":[{"role":"user","content":"Write a limerick about the wonders of GPU computing."}],"stream":true,"model":"meta/llama-3.1-405b-instruct","max_tokens":1024,"presence_penalty":0,"frequency_penalty":0,"top_p":0.7,"temperature":0.2}'
response=$(curl --silent -i -w "\n%{http_code}"--request POST \
--url "$invoke_url" \
--header "$authorization_header" \
--header "$accept_header" \
--header "$content_type_header" \
--data "$data")
echo "$response"
# 先将上面的内容写入的文件中
vi shell.sh
# 再修改这个shell的权限
chmod -R777 shell.sh
# 执行这个shell脚本
./shell.sh
但是打印出来的信息是截取的字段类型,那我们可以通过将所有的data中的content加在一起看一下效果:
# 提取content并加总
content_total =0for item in data_list:
content = item["choices"][0]["delta"]["content"]
content_total +=len(content)print("通过提取content字段,整理为如下信息", content_total)
就可以得到一个加总后的信息。
4. 识别图片:
OcdrNet
申请地址
https://build.nvidia.com/nvidia/ocdrnet?snippet_tab=Python
模型介绍
用于光学字符检测和识别的预训练模型
在网上找一张图片:
使用以下脚本:
import os
import sys
import uuid
import zipfile
import requests
# NVCFAPI 的OC DRNet模型端点
nvai_url ="https://ai.api.nvidia.com/v1/cv/nvidia/ocdrnet"
# 授权头,需要API key,如果在NGC之外执行
header_auth = f"Bearer $API_KEY_REQUIRED_IF_EXECUTING_OUTSIDE_NGC"
def _upload_asset(input, description):"""
上传一个资产到NVCFAPI。
:param input: 要上传的二进制资产
:param description: 资产的描述
:return: 资产ID(UUID对象)
"""
assets_url ="https://api.nvcf.nvidia.com/v2/nvcf/assets"
# 设置请求头
headers ={"Authorization": header_auth,"Content-Type":"application/json","accept":"application/json",}
# 设置S3请求头
s3_headers ={"x-amz-meta-nvcf-asset-description": description,"content-type":"image/jpeg",}
# 设置请求负载
payload ={"contentType":"image/jpeg","description": description}
# 发送POST请求以获取上传URL和资产ID
response = requests.post(assets_url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
asset_url = response.json()["uploadUrl"]
asset_id = response.json()["assetId"]
# 发送PUT请求上传资产
response = requests.put(
asset_url,
data=input,
headers=s3_headers,
timeout=300,)
response.raise_for_status()
# 返回资产IDreturn uuid.UUID(asset_id)if __name__ =="__main__":"""
上传一张自选图片到NVCFAPI,并向光学字符检测和识别模型发送请求。
响应保存到本地目录。
注意:必须设置环境变量NGC_PERSONAL_API_KEY。
"""
# 检查命令行参数数量
iflen(sys.argv)!=3:print("Usage: python test.py <image> <output_dir>")
sys.exit(1)
# 上传资产并获取资产ID
asset_id =_upload_asset(open(sys.argv[1],"rb"),"Input Image")
# 设置请求负载
inputs ={"image": f"{asset_id}","render_label": False}
# 设置资产列表
asset_list = f"{asset_id}"
# 设置请求头
headers ={"Content-Type":"application/json","NVCF-INPUT-ASSET-REFERENCES": asset_list,"NVCF-FUNCTION-ASSET-IDS": asset_list,"Authorization": header_auth,}
# 发送POST请求到OC DRNet模型
response = requests.post(nvai_url, headers=headers, json=inputs)
# 保存响应内容到本地ZIP文件
withopen(f"{sys.argv[2]}.zip","wb")as out:
out.write(response.content)
# 解压ZIP文件到输出目录
with zipfile.ZipFile(f"{sys.argv[2]}.zip","r")as z:
z.extractall(sys.argv[2])
# 输出保存目录和目录内容
print(f"Output saved to {sys.argv[2]}")print(os.listdir(sys.argv[2]))
代码相关解释:
这段代码是一个Python脚本,用于与NVIDIA Cloud AI Services(NVCF API)交互,上传一张图片,并使用其光学字符检测和识别(OC DRNet)模型对图片进行处理。处理完成后,结果将被保存到一个本地目录中。下面是对代码各部分的解释:
- 导入必要的库:- os:用于操作系统相关的功能,如文件操作。- sys:用于访问与Python解释器相关的变量和函数。- uuid:用于处理UUID(通用唯一标识符)。- zipfile:用于处理ZIP文件。- requests:用于发送HTTP请求。
- 设置API端点和授权头:- nvai_url:NVCF API的OC DRNet模型端点。- header_auth:授权头,需要API key。这里使用了一个占位符,实际使用时需要替换为有效的API key。
- 定义_upload_asset函数:- 这个函数用于上传一个资产(在这里是一张图片)到NVCF API。- 它接受两个参数:input(要上传的二进制资产)和description(资产的描述)。- 函数内部,首先通过发送POST请求获取上传URL和资产ID,然后使用PUT请求上传资产。- 最后返回资产ID(UUID对象)。
- 主程序逻辑:- 首先检查命令行参数数量,确保提供了图片路径和输出目录。- 使用_upload_asset函数上传图片并获取资产ID。- 设置请求负载,包括图片资产ID和其他参数。- 设置请求头,包括授权信息和资产引用。- 发送POST请求到OC DRNet模型进行处理。- 保存响应内容到本地ZIP文件,并解压到指定的输出目录。- 输出保存目录和目录内容。
注意:在实际运行此代码之前,需要确保已经安装了requests库,并且已经替换了header_auth中的占位符为有效的API key。此外,还需要提供正确的图片路径和输出目录作为命令行参数。
总的来说,这段代码演示了如何使用NVIDIA Cloud AI Services的API进行光学字符检测和识别任务,并将结果保存到本地目录中。
# 执行脚本
python3 tes.py 1.jpg img
Output saved to img
['out_a71bdf20-ce3c-4a7d-b192-d56dad1e79c7.jpg','a03aed07-dd73-4ac5-9cef-c106dd487f3d.response']
查看a03aed07-dd73-4ac5-9cef-c106dd487f3d.response数据:
版权归原作者 2401_86113894 所有, 如有侵权,请联系我们删除。