💬 加入Discord和社区电话会议 🔋 文档 💻 博客文章 ⌨ 示例 💾
<hr>下面是一个使用C++和Python Kompute接口的GPU乘法示例。
您可以加入Discord以提问/讨论,打开github问题,或阅读文档。
C++接口提供了对Kompute本机组件的低级访问,支持高级优化以及扩展组件。
void kompute(const std::string& shader) { // 1. 使用默认设置创建Kompute Manager(设备0,第一队列,无扩展) kp::Manager mgr; // 2. 通过管理器创建并初始化Kompute张量 // 默认张量构造函数简化了浮点值的创建 auto tensorInA = mgr.tensor({ 2., 2., 2. }); auto tensorInB = mgr.tensor({ 1., 2., 3. }); // 显式类型构造函数支持uint32, int32, double, float和bool auto tensorOutA = mgr.tensorT<uint32_t>({ 0, 0, 0 }); auto tensorOutB = mgr.tensorT<uint32_t>({ 0, 0, 0 }); std::vector<std::shared_ptr<kp::Tensor>> params = {tensorInA, tensorInB, tensorOutA, tensorOutB}; // 3. 基于着色器创建算法(支持缓冲区和推送/规范常量) kp::Workgroup workgroup({3, 1, 1}); std::vector<float> specConsts({ 2 }); std::vector<float> pushConstsA({ 2.0 }); std::vector<float> pushConstsB({ 3.0 }); auto algorithm = mgr.algorithm(params, // 参见文档中的着色器部分以编译源代码 compileSource(shader), workgroup, specConsts, pushConstsA); // 4. 使用序列同步运行操作 mgr.sequence() ->record<kp::OpTensorSyncDevice>(params) ->record<kp::OpAlgoDispatch>(algorithm) // 绑定默认的推送常量 ->eval() // 评估两条记录的操作 ->record<kp::OpAlgoDispatch>(algorithm, pushConstsB) // 覆盖推送常量 ->eval(); // 仅评估最后记录的操作 // 5. 异步从GPU同步结果 auto sq = mgr.sequence(); sq->evalAsync<kp::OpTensorSyncLocal>(params); // ... 在GPU完成时异步执行其他工作 sq->evalAwait(); // 打印第一个输出:{ 4, 8, 12 } for (const float& elem : tensorOutA->vector()) std::cout << elem << " "; // 打印第二个输出:{ 10, 10, 10 } for (const float& elem : tensorOutB->vector()) std::cout << elem << " "; } // 管理 / 释放所有CPU和GPU内存资源 int main() { // 定义一个原始字符串着色器(或使用Kompute工具编译为SPIRV / C++头文件 //)。此着色器展示了一些主要组件,包括常量、缓冲区等 std::string shader = (R"( #version 450 layout (local_size_x = 1) in; // 输入张量绑定索引相对于参数中传递索引 layout(set = 0, binding = 0) buffer buf_in_a { float in_a[]; }; layout(set = 0, binding = 1) buffer buf_in_b { float in_b[]; }; layout(set = 0, binding = 2) buffer buf_out_a { uint out_a[]; }; layout(set = 0, binding = 3) buffer buf_out_b { uint out_b[]; }; // Kompute支持调度时更新的推送常量 layout(push_constant) uniform PushConstants { float val; } push_const; // Kompute还支持初始化时的规范常量 layout(constant_id = 0) const float const_one = 0; void main() { uint index = gl_GlobalInvocationID.x; out_a[index] += uint( in_a[index] * in_b[index] ); out_b[index] += uint( const_one * push_const.val ); } )");
<SOURCE_TEXT> // 运行上面声明的函数并传入我们的原始字符串着色器 kompute(shader); }
Python 包 提供了一个高级交互界面,使得在确保高性能和快速开发工作流程的同时进行实验。
from .utils import compile_source # 使用 python/test/utils 中的工具函数 def kompute(shader): # 1. 使用默认设置(设备 0、第一个队列且无扩展)创建 Kompute 管理器 mgr = kp.Manager() # 2. 通过管理器创建并初始化 Kompute 张量 # 默认的张量构造函数简化了浮点值的创建 tensor_in_a = mgr.tensor([2, 2, 2]) tensor_in_b = mgr.tensor([1, 2, 3]) # 显式类型构造函数支持 uint32、int32、double、float 和 bool tensor_out_a = mgr.tensor_t(np.array([0, 0, 0], dtype=np.uint32)) tensor_out_b = mgr.tensor_t(np.array([0, 0, 0], dtype=np.uint32)) params = [tensor_in_a, tensor_in_b, tensor_out_a, tensor_out_b] # 3. 基于着色器创建算法(支持缓冲区和推送/规格常量) workgroup = (3, 1, 1) spec_consts = [2] push_consts_a = [2] push_consts_b = [3] # 参见文档中的着色器部分了解 compile_source spirv = compile_source(shader) algo = mgr.algorithm(params, spirv, workgroup, spec_consts, push_consts_a) # 4. 使用序列同步运行操作 (mgr.sequence() .record(kp.OpTensorSyncDevice(params)) .record(kp.OpAlgoDispatch(algo)) # 绑定默认的推送常量 .eval() # 执行记录的两个操作 .record(kp.OpAlgoDispatch(algo, push_consts_b)) # 覆盖推送常量 .eval()) # 仅执行最后记录的操作 # 5. 异步从 GPU 同步结果 sq = mgr.sequence() sq.eval_async(kp.OpTensorSyncLocal(params)) # ...... 在 GPU 完成时异步进行其他工作 sq.eval_await() # 打印第一个输出: { 4, 8, 12 } print(tensor_out_a) # 打印第二个输出: { 10, 10, 10 } print(tensor_out_b) if __name__ == "__main__": # 定义原始字符串着色器(或使用 Kompute 工具编译到 SPIRV / C++ 头文件)。 # 该着色器展示了一些主要组件,包括常量、缓冲区等 shader = """ #version 450 layout (local_size_x = 1) in; // 输入张量绑定索引相对于传递参数的索引 layout(set = 0, binding = 0) buffer buf_in_a { float in_a[]; }; layout(set = 0, binding = 1) buffer buf_in_b { float in_b[]; }; layout(set = 0, binding = 2) buffer buf_out_a { uint out_a[]; }; layout(set = 0, binding = 3) buffer buf_out_b { uint out_b[]; }; // Kompute 支持在调度时更新推送常量 layout(push_constant) uniform PushConstants { float val; } push_const; // Kompute 还支持在初始化时设置规格常量 layout(constant_id = 0) const float const_one = 0; void main() { uint index = gl_GlobalInvocationID.x; out_a[index] += uint( in_a[index] * in_b[index] ); out_b[index] += uint( const_one * push_const.val ); } """ kompute(shader)
您可以尝试使用免费的 GPU 进行交互式 Colab 笔记本。可用的示例包括以下 Python 和 C++ 示例:
<table> <tr> <td width="50%"> <h5>尝试 <a href="https://colab.research.google.com/drive/1l3hNSq2AcJ5j2E3YIw__jKy5n6M615GP?usp=sharing">C++ Colab</a> 的交互式 <a href="https://towardsdatascience.com/machine-learning-and-data-processing-in-the-gpu-with-vulkan-kompute-c9350e5e5d3a">博客文章</a></h5> </td> <td> <h5>尝试 <a href="https://colab.research.google.com/drive/15uQ7qMZuOyk8JcXF-3SB2R5yNFW21I4P">Python Colab</a> 的交互式 <a href="https://towardsdatascience.com/beyond-cuda-gpu-accelerated-python-for-machine-learning-in-cross-vendor-graphics-cards-made-simple-6cc828a45cc3">博客文章</a></h5> </td> </tr> <tr> <td width="50%"> <a href="https://colab.research.google.com/drive/1l3hNSq2AcJ5j2E3YIw__jKy5n6M615GP?authuser=1#scrollTo=1BipBsO-fQRD"> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/5c332567-8ce7-4113-8e7e-5eb93fbc4848.jpg"> </a> </td> <td> <a href="https://colab.research.google.com/drive/15uQ7qMZuOyk8JcXF-3SB2R5yNFW21I4P"> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/758884b1-9130-4f6e-a14d-d36bc64f5784.jpg"> </a> </td> </tr> </table>您还可以观看在 FOSDEM 2021 会议上展示的以下两个演讲。
两个视频都有时间戳,可以让您跳到最相关的部分——两者的介绍和 动机几乎相同,所以您可以跳到更多的具体内容。
<table> <tr> <td width="50%"> <h5>观看 <a href="https://www.youtube.com/watch?v=Xz4fiQNmGSA">C++ 爱好者</a> 的视频</h5> </td> <td> <h5>观看 <a href="https://www.youtube.com/watch?v=AJRyZ09IUdg">Python 和机器学习</a> 爱好者的视频</h5> </td> </tr> <tr> <td width="50%"> <a href="https://www.youtube.com/watch?v=Xz4fiQNmGSA"> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/df1b69b1-5b75-4e8e-98b9-8424b59f4b82.png"> </a> </td> <td> <a href="https://www.youtube.com/watch?v=AJRyZ09IUdg"> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/68f631d8-f454-4309-9380-761fe9012239.png"> </a> </td> </tr> </table>Kompute 的核心架构包括以下内容:
欲了解详细信息,请参阅C++ 类参考。
<table> <th> 全架构 </th> <th> 简化的 Kompute 组件 </th> <tr> <td width=30%> <img width="100%" src="https://yellow-cdn.veclightyear.com/35dd4d3f/6e33f921-0b3b-43cd-bd7b-b9630f780012.jpg"> <br> <br> (很小,查看<a href="https://ethicalml.github.io/vulkan-kompute/overview/reference.html">文档中的完整参考图</a>以了解详情) <br> <br> <img width="100%" src="https://yellow-cdn.veclightyear.com/35dd4d3f/209ec223-c957-4f04-aa9c-4252de0f37c6.jfif"> </td> <td> <img width="100%" src="https://yellow-cdn.veclightyear.com/35dd4d3f/0b669b3f-6f1a-44ad-aebb-de1977ff5a5b.jpg"> </td> </tr> </table>Kompute 通过 vk::Fences 提供了异步运行操作的灵活性。此外,Kompute 还支持队列的显式分配,允许在不同的队列族之间并行执行操作。
下图为 Kompute 序列分配到不同队列以启用基于硬件的并行执行提供了直观说明。您可以查看动手示例,以及描述其如何使用 NVIDIA 1650 作为示例的详细文档页面。
Kompute 已针对移动环境进行了优化。构建系统支持在 Android 环境中动态加载 Vulkan 共享库,以及一个工作的Android NDK 包装器用于 CPP 头文件。
<table> <tr> </SOURCE_TEXT> ``` <td width="70%"> <p> 如果想要深入了解,您可以阅读博客文章 "<a href="https://towardsdatascience.com/gpu-accelerated-machine-learning-in-your-mobile-applications-using-the-android-ndk-vulkan-kompute-1e9da37b7617">用流设备GPU加速机器学习来提升您的移动应用</a>"。您还可以在储存库中访问 <a href="https://github.com/KomputeProject/kompute/tree/v0.4.0/examples/android/android-simple">端到端示例代码</a>,该代码可以使用安卓工作室运行。
</p> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/750d3967-8966-4c78-8b6c-35e529982ba7.jpg"> </td> <td width="30%"> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/02dea172-a75a-4ad5-a2f0-64236b819ccd.jpg"> </td> </tr> </table>除了C++核心SDK,您还可以使用Kompute的Python包,该包提供相同的核心功能,并支持与Python对象(如Lists、Numpy Arrays等)的互操作性。
唯一的依赖项是Python 3.5+和Cmake 3.4.1+。您可以使用以下命令从Python pypi包中安装Kompute。
pip install kp
您还可以从master分支安装:
pip install git+git://github.com/KomputeProject/kompute.git@master
有关更多详细信息,您可以阅读Python包文档或Python类参考文档。
提供的构建系统使用cmake
,允许跨平台构建。
顶层的Makefile
提供了一组针对开发和docker镜像构建的优化配置,但您可以使用以下命令开始构建:
cmake -Bbuild
您还可以使用add_subdirectory
将Kompute添加到您的repo中,安卓示例CMakeLists.txt文件展示了如何完成这项工作。
有关构建配置的更高级概述,请参阅构建系统深度剖析文档。
我们欢迎PR和Issue贡献。如果您想贡 献代码,请尝试查看“好第一个问题”标签,但即便是使用Kompute并报告问题也是极大的贡献!
如果您想使用debug层运行,您可以通过以下参数添加它们:
export KOMPUTE_ENV_DEBUG_LAYERS="VK_LAYER_LUNARG_api_dump"
要更新文档,您需要:
make push_docs_to_ghpages
推送到github页面对于贡献者来说,运行单元测试已经大大简化。
测试在CPU上运行,可以使用ACT命令行界面触发(https://github.com/nektos/act) - 一旦您安装了命令行(并启动了Docker守护程序),您只需键入:
$ act
[Python Tests/python-tests] 🚀 Start image=axsauze/kompute-builder:0.2
[C++ Tests/cpp-tests ] 🚀 Start image=axsauze/kompute-builder:0.2
[C++ Tests/cpp-tests ] 🐳 docker run image=axsauze/kompute-builder:0.2 entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
[Python Tests/python-tests] 🐳 docker run image=axsauze/kompute-builder:0.2 entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
...
储存库包含C++和Python代码的单元测试,可以在test/
和python/test
文件夹下找到。
这些测试目前通过Github Actions在CI中运行。它使用docker-builders/
文件夹中的镜像。
为了减少硬件要求,测试可以直接在CPU上运行,无需GPU,使用Swiftshader。
有关CI和测试设置的更多信息,您可以访问文档中的CI、Docker和测试部分。
在看到许多新的和知名的机器学习和深度学习项目(如Pytorch、Tensorflow、阿里巴巴DNN、腾讯NCNN等)已经或正在考虑将Vulkan SDK集成以增加移动设备(和跨供应商)的GPU支持后,该项目启动。
Vulkan SDK提供了一个优秀的低级接口,使得高度专业化的优化成为可能——然而它的代价是高度冗长的代码,需要500-2000行代码才能开始编写应用程序代码。这导致每个项目都必须实现相同的基线来抽象与计算无关的Vulkan SDK特性。这大量的非标准化样板代码可能导致知识转移有限,以及引入独特框架实现错误的机会更大等问题。
我们目前正在开发Kompute并不是为了隐藏Vulkan SDK接口(因为它设计得非常好),而是为了增强其以直接专注于Vulkan SDK的GPU计算能力。这篇文章提供了Kompute动机的高层概述,并介绍了一系列实际操作示例,这些示例介绍了GPU计算以及核心Kompute架构。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号