在快速发展的软件开发领域,聊天机器人和 GitHub Copilot 极大地改变了开发人员编写和管理代码的方式。这些工具建立在 大型语言模型(LLM)基础上,通过自动化日常编码任务来提高生产力。
并行计算挑战
然而,LLM 在生成并行计算代码中的使用对于 高性能计算(HPC)应用程序遇到了挑战。 并行计算应用程序需要对功能编程的逻辑和管理多个并发操作(如避免死锁和竞争条件)所涉及的复杂性有细致的理解。传统的人工智能模型可以有效地生成串行代码,但由于这些增加的复杂性,生成并行结构的代码变得困难。
NVIDIA 也面临着生成复杂代码的挑战,以支持新型加速计算半导体的设计。为了解决这一问题,高度相关的工作 ChipNeMo 于 2023 年超级计算期间发表,成功地应用了 域自适应预训练(DAPT)和 检索增强生成(RAG)技术,为工程师提供了 EDA 副驾驶。DAPT 与先进的 RAG 技术的结合很好地解决了桑迪亚科学家面临的问题,并启动了以下合作。
一个科学家团队来自 桑迪亚国家实验室,他们启动了一个雄心勃勃的项目,基于 NVIDIA NeMo 软件产品,如早期访问 nResolve-40K(嵌入模型),以解决这些挑战。他们开发了一个专门的编码助理 Kokkos,一个 C++ 库,它为您提供了编写性能可移植应用程序的工具。该库抽象了硬件复杂性,并使代码能够在不同类型的高性能计算(HPC)架构上高效运行。
为这样一个特定的任务创建人工智能模型通常需要使用特定领域的知识对基础模型进行微调,这是一个资源密集且耗时的过程。为了在软件更新和错误修复方面保持敏捷,HPC 开发人员通常更喜欢更灵活的方法。
该助手旨在利用最新的人工智能进步,提供准确、上下文感知的代码建议,为您提供支持。
实施先进的 RAG
Sandia 正在与 NVIDIA 合作开发一种先进的 RAG 方法,以实现模块化工作流程,该工作流程可适应正在进行的数据集更改,并在最先进的模型发布后立即将其与 HPC 工作负载集成。
根据桑迪亚极限规模计算高级经理 Robert Hoekstra,博士的观点,包括桑迪亚在内的多个行业的组织正在通过 NVIDIA 生成人工智能来解锁有价值的见解,实现对其企业数据的语义搜索。桑迪亚和 NVIDIA 正在合作评估新兴的生成人工智能工具,以最大限度地提高数据洞察力,同时提高准确性和性能。
桑迪亚的科学家通过使用 Kokkos 编译,创建了一个动态且不断更新的数据集。借助 C 编程的递归文本分割器,可以将数据集组织成可管理的块。接着,这些数据集块被转换为矢量嵌入并存储在数据库中,从而产生了一种比微调更不耗费资源的过程。
当进行查询时,它被转换为一个向量,该向量根据余弦相似性从数据库中检索相关的代码块。然后,这些块用于提供生成响应的上下文,创建包含真实世界编码模式和解决方案的丰富、知情的输出。
RAG 评估
在 Sandia 对 naive RAG 的初步评估中,使用了包括 BLEU、ChrF、METEOR 和 ROUGE-L 在内的各种指标,根据 Sandia Kokkos 开发人员提供的标准基准来评估生成代码的有效性。令人鼓舞的是,初步结果显示,随着 RAG 方法的实施,标度平均值评估增加了 3-4 个点。
嵌入模型 | LLM |
BGE–大型–EN–V 1.5 | 无效–7B–指令–V0.2 |
E5–底座–V2。 | MIXTRAL–8X7V–指令–V 0.1 |
NVolve40K | WIZARDCODER–15B–V1.0 |
UAE–大–V1 | 魔术师–S–DS–6.7 B。 |
模型 | OSS 标度平均值 | RAG 标度平均值 |
mistralai-MIstral-7B-Instruction-v0.2 | 18.75 | 22.59 |
mistralai-Mixtral-8x7B-仪器-v0.1 | 23.68 | 23.85 |
WizardLM_WizardCoder-15B-V1.0 | 25.01 | 28.61 |
ise-uiuc_MagicCoder-S-DS-6.7B | 25.90 | 28.96 |
模块化 HPC 工作流的 RAG 结果
通过天真的 RAG 管道实施,实现了微小的性能改进。Mixtral 模型(MoE 架构)没有受到附加 Kokkos 上下文的显著影响。
没有找到优越的嵌入模型。相反,嵌入模型和 LLM 的特定配对提供了最佳结果。
用于多查询检索的 RAG
桑迪亚团队还试验了先进的 RAG 技术,以改进如何检索相关内容。
其中一种技术涉及生成多个相关查询,以扩大对适用代码片段的搜索范围,尤其是当用户查询模糊或缺乏特定细节时。这种方法提高了检索更相关上下文的可能性,增强了生成代码的准确性和有用性。
以下示例显示了一个查询以及由多查询检索器创建的生成查询。
Prompt: Create a Kokkos view of doubles with size 10 x 3
Generated Queries:
1. How can I create a Kokkos view of doubles with size 10 x 3?
2. How can I create a Kokkos view of doubles with size 10 x 3 and initialize it with random values?
3. How can I create a Kokkos view of doubles with size 10 x 3 and initialize it with values from a file?
丰富数据集上下文
桑迪亚的研究人员也在探索母文档检索器的方法。在这种方法中,数据被分割成提供一般上下文的大的父块和专注于特定细节的小的子块。
这一策略有助于平衡对具体性和广度的需求,优化检索信息的相关性和全面性。
下面的提示示例显示了用于搜索数据库的子块和父块。
Prompt: Create a Kokkos view of doubles with size 10 x 3
Child Chunk:
// Create the Kokkos::View X_lcl.
const size_t numLclRows = 10;
const size_t numVecs = 3;
typename dual_view_type::t_dev X_lcl ("X_lcl", numLclRows, numVecs);
Parent Chunk:
// Create the Kokkos::View X_lcl.
const size_t numLclRows = 10;
const size_t numVecs = 3;
typename dual_view_type::t_dev X_lcl ("X_lcl", numLclRows, numVecs);
// Modify the Kokkos::View's data.
Kokkos::deep_copy (X_lcl, ONE);
{
lclSuccess = success ? 1 : 0;
gblSuccess = 0; // output argument
reduceAll<int, int=""> (*comm, REDUCE_MIN, lclSuccess, outArg (gblSuccess));
TEST_EQUALITY_CONST(gblSuccess, 1);
if (gblSuccess != 1) {
return;
}
std::ostringstream os;
os << "Proc " << comm->getRank () << ": checkpoint 1" << std::endl;
std::cerr << os.str ();
}
</int,>
HPC 结果的高级人工智能
Sandia 团队的初步评估使用了标准的 NLP 指标,如 BLEU(双语评估研究)和 ROUGE(面向回忆的 Gisting 评估研究)。
然而,他们认识到需要一个更适合代码生成的更具针对性的评估指标,特别是一个可以在不依赖传统输出比较的情况下评估生成代码的语法准确性和操作效率的指标。
增强未来的代码功能
随着桑迪亚的科学家们完善他们的检索方法和人工智能模型,他们预计编码助理不仅能生成功能准确的代码建议,还能生成与上下文相关的代码建议。未来的开发将侧重于微调基本模型,类似于 NVIDIA 工程师在 ChipNemo 上所做的工作,并改进检索过程,并在可用时集成更先进的 LLM 和嵌入技术。
人工智能用于 HPC 代码开发
将人工智能集成到代码开发中,特别是在高性能计算的范围内,代表着生产力和效率的重大飞跃。NVIDIA NeMo 等一些产品站在这一变革的最前沿,突破了人工智能在复杂计算环境中所能实现的极限。通过不断调整和改进他们的人工智能模型和方法,桑迪亚旨在为您提供强大的工具,增强您创新和解决复杂问题的能力。
这一先进的 RAG 倡议展示了人工智能在软件开发中的潜力,并强调了有针对性的解决方案在技术进步中的重要性。
在桑迪亚,他们正在评估内部和外部云解决方案,以承载这些复杂的人工智能模型,这需要大量的 GPU 资源。选择取决于合适硬件的可用性和桑迪亚团队的使用规模。与 NVIDIA 等供应商合作可以提供宝贵的支持,尤其是将其容器系统与 Sandia 现有的基础设施集成。
更多信息
有关更多信息,请参阅以下资源:
- 充分发掘企业数据价值:使用 RAG(需要登录):引入 RAG,这是一个将信息查找与文本或代码生成相结合的系统,可以最大限度地提高企业数据的价值。
ChipNeMo:领域适应型语言模型(LLM)用于芯片设计:该研究包括了 RAG 在创建芯片设计 EDA 脚本中的应用实践,以及用于创建并行代码的 RAG 模型所面临的一些类似特性的挑战。