NVIDIA ACE 是一套数字人技术,可借助生成式 AI 让游戏角色和数字助理如生。ACE 设备上模型为自主游戏角色提供代理工作流,这些角色可以感知环境、理解多模态输入、战略性地规划一组行动并实时执行所有这些行动,从而为玩家提供动态体验。
为了与游戏引擎一起运行这些模型, NVIDIA In-Game Inferencing (NVIGI) SDK 使您能够将 AI 推理直接集成到 C++ 游戏和应用中,以实现出色的性能和延迟。
本文介绍了 NVIGI 如何与 NVIDIA ACE 集成,在游戏开发中实现无缝 AI 推理。我们介绍了 NVIGI 架构、主要功能,以及如何开始使用 NVIDIA ACE 设备端模型创建自主角色。
NVIDIA ACE 设备端模型
NVIDIA ACE 支持由生成式 AI 提供支持的语音、智能和动画。它提供了一套 AI 模型,使游戏角色能够根据玩家的互动进行实时感知、推理和行动:
- 感知: 即将推出的 NeMoAudio-4B-Instruct 模型通过提高音频的上下文感知来增强角色交互。您可以轻松集成更多的多模态模型,通过整合其他感官输入来进一步扩展这些功能。
- 认知 : Mistral-Nemo-Minitron-Instruct 系列小语言模型 在指令跟随功能方面位列图表榜首,这些功能可让角色准确地进行角色扮演。
- 内存: 嵌入 E5-Large-Unsupervised 等模型可让角色回想起过去的交互,丰富沉浸感。
- 动画 :Audio2Face 等实时 AI 驱动的 动画 可实现精确的唇部同步,呈现动态生动的情绪。
- 动作: 简单的界面和自定义逻辑使角色能够采取有意义的行动,从选择游戏中的响应到执行战略计划,再到模型驱动的决策和提示。
什么是 NVIDIA In-Game Inferencing SDK?

NVIGI SDK 是一款基于插件的 GPU 优化推理管理器,旨在简化 ACE 模型与游戏和交互式应用的集成。它提供以下功能:
- 插件灵活性: 轻松添加、更新和管理 AI 插件 (ASR、语言模型、嵌入)。
- Windows 原生 DLL: 简化 C++ 游戏和应用的工作流。
- GPU 优化: 使用 compute-in-graphics (CIG) 技术,在执行渲染任务的同时实现高效的 AI 推理。
通过将 NVIGI 与 ACE 相结合,您可以创建具有高级生成式 AI 功能的自主角色,例如实时 NPC 对话、上下文内存和如生的动画。
NVIGI 的工作原理
NVIGI 架构的核心是基于模块化插件,可灵活集成各种 AI 功能:
- 核心插件 :提供自动语音识别(ASR)、生成式推理和嵌入检索等 AI 功能。
- 辅助插件: 处理 GPU 调度和网络通信等实用程序。
- 统一 API: 简化插件管理并降低代码复杂性。
- 本地和云执行: 支持设备上推理 (CPU/GPU) 和基于云的 AI 工作流。
这些组件协同工作,提供无缝的 AI 驱动的游戏体验。例如,想象一个玩家向 NPC 提问。NVIGI 编排代理工作流,使角色能够实时聆听、推理、讲话并制作动画。
此过程遵循几个关键步骤:
- 使用 ASR 聆听用户的声音:NPC 使用 NVIDIA Riva ASR 处理玩家语音,将口语输入转换为文本,以便进一步推理。
- 使用 SLM 生成响应:转录文本将传递至小型语言模型 (SLM),例如 Mistral-NVIDIA NeMo Curator-Minitron-128K-Instruct,该模型会生成与上下文相关的动态响应。如果需要其他上下文,可以使用检索增强生成 (RAG) 方法,其中 E5-Large-Unsupervised 等嵌入模型将文本转换为向量表示。然后,在相似性搜索中使用这些向量来检索相关知识,从而通过额外的上下文丰富 SLM 的响应。
- 使用 TTS 为角色提供语音 :生成的响应被合成为如生的声音,确保自然的语调和表现力。
- 创建交互式动画 :然后,语音响应使用 Audio2Face-3D 驱动面部 Blendshape 以实现实时动画,确保准确的唇部同步和富有表现力的角色动作。
在整个过程中,GPU 调度和 CiG 可确保 AI 推理工作负载与渲染任务同时运行,同时最大限度地减少对帧率的影响。这可确保提供无缝的实时体验。
有关为进程内执行实现这些插件和模型的更多信息,请参阅后续部分。
ACE 设备端推理入门
本节概述了如何将 NVIGI 与 ACE SLM 结合使用,以便与渲染工作负载一起启用进程内 AI 推理。
NVIGI 包含批处理文件,这些文件可从 NVIDIA NGC 和 Hugging Face 等资源库中获取模型。这样可以将初始下载量降至最低,并确保您只需下载要使用的模型即可。它还包含一套本地推理插件,我们稍后会重点介绍这些插件,以帮助您入门。
初始化 NVIGI
第一步是初始化 NVIGI 框架。此过程会设置 NVIGI 在游戏中运行所需的插件路径、日志记录和核心配置。
以下代码示例展示了如何在游戏中初始化 NVIGI:
nvigi::Preferences preferences{};
preferences.logLevel = nvigi::LogLevel::eVerbose; // Enable verbose logging
preferences.utf8PathsToPlugins = {"path/to/plugins"}; // Set plugin path
preferences.utf8PathToLogsAndData = "path/to/logs"; // Define log path
if (nvigiInit(preferences, nullptr, nvigi::kSDKVersion) != nvigi::kResultOk) {
std::cerr << "Failed to initialize NVIGI." << std::endl;
}
加载插件和模型
NVIGI 架构围绕具有模块化和灵活性的插件系统构建。包含适用于 LLM、ASR 和嵌入检索等 AI 模型类别的插件。借助这些插件,您可以部署 ACE 范围的 AI 模型,以实现所需的功能和行为。
每个插件都支持多个共享指定后端和底层 API 的模型。NVIGI 包含支持热门后端 (例如 GGML (llama.cpp
、whisper.cpp
、embedding.cpp
)、ONNX Runtime 和 DirectML) 的进程内插件。
以下是一些示例:
nvigi.plugin.asr.ggml.cuda
:使用 GGML 和 CUDA 将语音转换为文本。nvigi.plugin.gpt.ggml.cuda
:为 AI 生成的对话和推理提供支持。nvigi.plugin.embed.ggml.*
:根据情感查找相关文本,以提供更好的上下文。
要使用 GPT 插件,请先加载其接口以查询模型的功能:
// Load GPT plugin interface
nvigi::IGeneralPurposeTransformer* gpt = nullptr;
nvigiGetInterfaceDynamic(nvigi::plugin::gpt::ggml::cuda::kId, &gpt, ptr_nvigiLoadInterface);
首先,NVIGI 预加载了一系列可手动下载的模型,但您可以从 NGC 或 Hugging Face 上获得更多 GGUF 模型。然后,为插件定义模型参数,例如以下示例:
// Configure model parameters
nvigi::CommonCreationParameters common{};
common.utf8PathToModels = "path/to/models";
common.numThreads = 8; // Number of CPU threads
common.vramBudgetMB = vram; // VRAM allocation in MB
common.modelGUID = "{YOUR_MODEL_GUID}"; // Model GUID
加载接口和模型参数后,配置一个实例或进程内推理:
// Create GPT instance
nvigi::InferenceInstance* gptInstance = nullptr;
if (gpt->createInstance(common, &gptInstance) != nvigi::kResultOk || !gptInstance) {
std::cerr << "Failed to create GPT instance." << std::endl;
}
// Use GPT instance for inference
创建运行时配置和推理
InferenceInstance
接口提供用于执行推理任务的 API,并通过 InferenceExecutionContext
进行配置。此接口支持设置输入槽、运行时参数和回调机制,以检索模型响应。
推理任务依赖于输入数据 (例如播放器文本或音频) 以及运行时配置。可以使用 nvigi::kGPTDataSlotSystem
插槽确定用于定义游戏角色个性和角色的上下文:
// Define NPC role in a system prompt
std::string npcPrompt = "You are a helpful NPC named TJ in a fantasy game.";
nvigi::CpuData systemPromptData(npcPrompt.length() + 1, npcPrompt.c_str());
nvigi::InferenceDataText systemPromptSlot(systemPromptData);
// Set runtime parameters
nvigi::GPTRuntimeParameters runtime{};
runtime.tokensToPredict = 200; // Limit token prediction to 200 tokens
runtime.interactive = true; // Enable multi-turn conversations
std::vector<nvigi::InferenceDataSlot> slots = {
{nvigi::kGPTDataSlotSystem, &systemPromptSlot}
};
// Inference context
nvigi::InferenceExecutionContext gptExecCtx{};
gptExecCtx.instance = gptInstance;
gptExecCtx.runtimeParameters = runtime;
gptExecCtx.inputs = slots.data();
玩家和游戏角色之间的动态交互可以通过以下方式进行管理:
std::string userInput = "What’s your name?"; // example user input
nvigi::CpuData userInputData(userInput.length() + 1, userInput.c_str());
nvigi::InferenceDataText userInputSlot(userInputData);
slots = {{nvigi::kGPTDataSlotUser, &userInputSlot}};
gptExecCtx.inputs = slots.data();
异步运行推理和处理响应
if (gptExecCtx.instance->evaluate(&gptExecCtx) == nvigi::kResultOk) {
std::cout << "Inference completed successfully!" << std::endl;
}
每次对话都通过 nvigi::kGPTDataSlotUser
输入插槽进行处理,从而为多回合对话保留上下文。
您还可以实现回调函数来捕获角色响应,以便在游戏中显示,下一节将展示示例。
启用 GPU 调度和渲染集成
游戏中的 AI 工作负载与渲染任务同时运行,因此有效的 GPU 调度对于保持帧率至关重要。NVIGI 使用 CIG 高效调度 GPU 工作负载。
为了高效地调度图形和计算,NVIGI 必须获得游戏用于图形的 D3D Direct 队列。D3D12Parameters
结构可确保 NVIGI 直接与渲染管线集成,从而使 AI 任务能够并行运行,而不会影响图形性能。
以下代码示例展示了如何使用 NVIGI IHWICuda
接口 (以 ASR 插件为例) 启用 CIG 以进行 AI 推理:
// Enable Compute-in-Graphics (CIG)
nvigi::IHWICuda* icig = nullptr;
if (nvigiGetInterface(nvigi::plugin::hwi::cuda::kId, &icig) != nvigi::kResultOk || !icig) {
std::cerr << "Failed to load CIG interface." << std::endl;
return;
}
// Set up D3D12 parameters
nvigi::D3D12Parameters d3d12Params{};
d3d12Params.device = myD3D12Device; // D3D12 device used for rendering
d3d12Params.queue = myD3D12CommandQueue; // Graphics command queue
// Activate GPU scheduling for both inference and rendering
if (icig->enableComputeInGraphics(d3d12Params) != nvigi::kResultOk) {
std::cerr << "Failed to enable Compute-in-Graphics." << std::endl;
return;
}
std::cout << "Compute-in-Graphics enabled successfully." << std::endl;
要在 Unreal Engine 5 (UE5) 中设置 NVIDIA GPU 调度,请使用全局动态渲染硬件接口 (RHI) 访问游戏的 D3D 设备和命令队列。
在 UE5 中配置 CIG 非常简单:
// UE5-specific code to retrieve D3D12 resources
#include "ID3D12DynamicRHI.h"
ID3D12DynamicRHI* RHI = nullptr;
if (GDynamicRHI && GDynamicRHI->GetInterfaceType() == ERHIInterfaceType::D3D12)
{
RHI = static_cast<ID3D12DynamicRHI*>(GDynamicRHI);
}
ID3D12CommandQueue* CmdQ = nullptr;
ID3D12Device* D3D12Device = nullptr;
if (RHI) {
CmdQ = RHI->RHIGetCommandQueue(); // Get graphics command queue
int DeviceIndex = 0;
D3D12Device = RHI->RHIGetDevice(DeviceIndex); // Get D3D12 device
}
// Configure D3D12 parameters for IGI
nvigi::D3D12Parameters d3d12Params{};
d3d12Params.device = D3D12Device;
d3d12Params.queue = CmdQ;
// Pass the parameters to IGI instances
nvigi::CommonCreationParameters commonParams{};
commonParams.chain(d3d12Params);
// Example: Creating an ASR instance with CIG
nvigi::ASRCreationParameters asrParams{};
asrParams.common = &commonParams;
nvigi::InferenceInstance* asrInstance = nullptr;
iasr->createInstance(asrParams, &asrInstance);
运行推理
NVIGI 上的推理任务涉及设置对话上下文、处理用户输入以及动态生成响应。以下步骤概述了如何在游戏环境中高效运行推理任务。
要执行推理,您必须创建推理上下文,其中包括以下内容:
- 输入槽 :以模型可以处理的格式准备输入数据 (用户文本、语音数据)。
- 运行时参数 :定义推理行为,例如要预测的令牌数量或交互性设置。
- 回调机制 :指定如何处理输出结果。
推理上下文定义了输入和输出的处理方式。首先启用交互式模式并准备 runtime parameters:
// Configure runtime parameters for GPT
nvigi::GPTRuntimeParameters runtime{};
runtime.tokensToPredict = 200; // Predict up to 200 tokens
runtime.interactive = true; // Enable interactive mode
// Set up inference context
nvigi::InferenceExecutionContext gptExecCtx{};
gptExecCtx.instance = gptInstance; // Use the GPT instance created earlier
gptExecCtx.runtimeParameters = runtime;
gptExecCtx.callback = [](const nvigi::InferenceExecutionContext* execCtx, nvigi::InferenceExecutionState state, void* userData) {
if (state == nvigi::kInferenceExecutionStateDone && execCtx->outputs){
const nvigi::InferenceDataText* responseText = nullptr;
execCtx->outputs->findAndValidateSlot(nvigi::kGPTDataSlotResponse, &responseText);
if (responseText) {
std::cout << "NPC Response: " << responseText->getUtf8Text() << std::endl;
}
}
return state;
};
您可以通过提供定义 NPC 个性或角色的系统提示来开始对话。为此,请使用 nvigi::kGPTDataSlotSystem
插槽:
// Set up conversation context
std::string npcPrompt = "You are a helpful NPC in a fantasy game. Respond thoughtfully to player questions.";
nvigi::CpuData systemPromptData(npcPrompt.length() + 1, npcPrompt.c_str());
nvigi::InferenceDataText systemPromptSlot(systemPromptData);
std::vector<nvigi::InferenceDataSlot> slots = {
{nvigi::kGPTDataSlotSystem, &systemPromptSlot} // Set the system prompt
};
gptExecCtx.inputs = slots.data();
gptExecCtx.numInputs = slots.size();
// Execute to initialize conversation context
if (gptExecCtx.instance->evaluate(&gptExecCtx) != nvigi::kResultOk) {
std::cerr << "Failed to initialize conversation context." << std::endl;
return;
}
可用 NVIGI 插件列表
您可以立即使用以下语音和智能模型开始构建用于设备上推理的智能体框架。
NVIGI 插件 | 支持的推理硬件 | 支持的模型 |
语音 – ASR 本地 GGML | 支持 CUDA 的 GPU 或 CPU | Whisper ASR |
语音 – ASR 本地 TRT | 支持 CUDA 的 GPU | NVIDIA RIVA ASR ( 即将推出 ) |
语言 – GPT 本地 ONNX DML | ONNX 支持的 GPU 或 CPU | Mistral-7B-Instruct |
语言 – GPT 本地 GGML | 支持 CUDA 的 GPU 或 CPU | Llama-3.2-3b Instruct Nemotron-Mini-4B-Instruct Mistral-Nemo-Minitron-2B-128k-Instruct Mistral-Nemo-Minitron-4B-128k-Instruct Mistral-Nemo-Minitron-8B-128k-Instruct Nemovision-4B-Instruct |
RAG – 嵌入本地 GGML | 支持 CUDA 的 GPU 或 CPU | E5 大型无监督学习 |
结束语
NVIDIA ACE 和 NVIGI 代表着 AI 驱动的游戏开发的下一步发展。通过将 ACE 先进的生成式 AI 模型与 NVIGI 无缝集成和 GPU 优化的性能相结合,您可以将交互性和沉浸感提升到新的水平。
从动态 NPC 对话和实时语音识别到逼真的动画和上下文内存,ACE 和 NVIGI 为创建智能、自主角色提供了经济高效且可扩展的解决方案。