{"id":13430877,"url":"https://github.com/prajna-lang/prajna","last_synced_at":"2025-03-16T06:31:38.871Z","repository":{"id":65243723,"uuid":"542360023","full_name":"prajna-lang/prajna","owner":"prajna-lang","description":"a program language for AI infrastructure","archived":false,"fork":false,"pushed_at":"2024-09-09T17:33:39.000Z","size":1173,"stargazers_count":83,"open_issues_count":7,"forks_count":12,"subscribers_count":4,"default_branch":"dev","last_synced_at":"2024-09-09T21:45:31.560Z","etag":null,"topics":["compiler","language","machine-learning","numeric"],"latest_commit_sha":null,"homepage":"http://www.matazure.com","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prajna-lang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-28T01:38:42.000Z","updated_at":"2024-09-09T17:33:43.000Z","dependencies_parsed_at":"2023-07-24T07:58:36.141Z","dependency_job_id":"e00c456d-86c0-4964-b594-c8b4653631d8","html_url":"https://github.com/prajna-lang/prajna","commit_stats":null,"previous_names":["prajna-lang/prajna"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prajna-lang%2Fprajna","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prajna-lang%2Fprajna/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prajna-lang%2Fprajna/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prajna-lang%2Fprajna/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prajna-lang","download_url":"https://codeload.github.com/prajna-lang/prajna/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221656458,"owners_count":16858774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","language","machine-learning","numeric"],"created_at":"2024-07-31T02:00:58.651Z","updated_at":"2024-10-27T09:31:02.214Z","avatar_url":"https://github.com/prajna-lang.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"# 般若编程语言\n\n[![Jenkins](http://dev.matazure.com:8080/job/prajna/job/main/badge/icon)](http://dev.matazure.com:8080/blue/organizations/jenkins/prajna/activity)\n\n般若是一门专门为构建更加模块化, 自动化和智能化的人工智能基础设施而研发的开源编程语言. 般若编程语言的目标是同时满足人工智能研究, 训练和部署等多个阶段的使用; 可以简易使用的CPU, GPU和各种TPU为人工智能提供算力.\n\n```mermaid\ngraph LR\n    CPU --\u003e Prajna\n    GPU --\u003e Prajna\n    TPU --\u003e Prajna\n\n    Prajna --\u003e Training\n    Prajna --\u003e Deployment\n    Prajna --\u003e Research\n```\n\n## 人工智能基础设施现状\n\n目前我们在建设人工智能基础设施时, 需要掌握C++, Python, CUDA和Triton等多门编程语言和技术, 这增加了软件开发的门槛和负担, 使得构建更加稳定和先进的人工智能基础设施尤为困难, 也阻碍了人工智能的进一步发展.\n\n芯片行业研发了多种CPU, GPU, TPU和针对特定领域的加速卡, 这些处理器有着不同的硬件架构和软件生态, 进一步加剧了整个人工智能基础设施的碎片化.\n\n对于人工智能基础设施\u003cstrong\u003e研发效率低\u003c/strong\u003e和\u003cstrong\u003e碎片化严重\u003c/strong\u003e的现状, 急需为人工智能基础设施专门设计一门编程语言, 围绕其重构我们的人工智能基础设施. 为此我们设计开发了般若编程语言.\n\n## 般若语言特性\n\n### 即时编译\n\n般若采用即时编译方式,代码即程序, 无需事先编译为二进制可执行程序. 可以直接在X86, Arm和RiscV等各种指令集的芯片上直接运行. 采用LLVM作为后端, 所以会有着和C/C++一样的性能.\n\n### GPU/异构编程\n\n般若将同时提供对CPU, GPU和TPU的编程支持. 目前般若不止提供类似于CUDA的核函数编写, 还提供了gpu for等简单高效的并行编程范式, 会极大低降低异构/并行编程的复杂性. 后期会加大对各种芯片的支持力度\n\n### 张量计算\n\n般若后面会集成类型于MLIR和TVM的张量优化技术, 提供高效, 并行乃至分布式计算的支持. 把张量计算相关的并行计算, 分布式计算的支持放在底层, 会非常有利于后续神经网络等框架的开发.\n\n### 语法改善\n\n般若是属于类C语言, 借鉴了Rust的面向对象的设计, 移除不必要的语法特性, 例如引用等. 内存管理采用比较通用的引用计数.\n\n### 友好交互\n\n般若支持main函数, Repl和Jupyter等多种交互方式, 适合算法研发和部署等多种场景.\n\n## 使用实例\n\n```prjana\nuse ::gpu::*;\nuse ::gpu::Tensor\u003cf32, 2\u003e as GpuMatrixf32;\n\n@kernel\n@target(\"nvptx\")\nfunc MatrixMultiply(A: GpuMatrixf32, B: GpuMatrixf32, C: GpuMatrixf32) {\n    var thread_x = ::gpu::ThreadIndex()[1];\n    var thread_y = ::gpu::ThreadIndex()[2];\n    var block_x = ::gpu::BlockIndex()[1];\n    var block_y = ::gpu::BlockIndex()[2];\n    var block_size = 32;\n    var global_x = block_x * block_size + thread_x;\n    var global_y = block_y * block_size + thread_y;\n\n    var sum = 0.0f32;\n    var step = A.Shape()[1] / block_size;\n    for i in 0 to step {\n        @shared\n        var local_a: Array\u003cf32, 1024\u003e;\n        @shared\n        var local_b: Array\u003cf32, 1024\u003e;\n        local_a[thread_x* 32 + thread_y] = A[global_x, thread_y + i * block_size];\n        local_b[thread_x* 32 + thread_y] = B[thread_x + i * block_size , global_y];\n        ::gpu::BlockSynchronize();\n\n        for j in 0 to 32 {\n          sum = sum + local_a[thread_x * 32 + j] * local_b[j * 32 + thread_y];\n        }\n        ::gpu::BlockSynchronize();\n    }\n\n    C[global_x, global_y] = sum;\n}\n\n@test\nfunc Main() {\n    var block_size = 32;\n    var block_shape = [1, block_size, block_size]; // 注意和cuda的dim是相反的顺序, [z, y, x]\n    var a_shape = [10 * 32, 10 * 32];\n    var b_shape = [10 * 32, 20 * 32];\n    var grid_shape = [1, a_shape[0] / block_size, b_shape[1] / block_size];\n\n    var A = GpuMatrixf32::Create(a_shape);\n    var B = GpuMatrixf32::Create(b_shape);\n    var C = GpuMatrixf32::Create([a_shape[0], b_shape[1]]);\n\n    MatrixMultiply\u003c|grid_shape, block_shape|\u003e(A, B, C);\n\n    var epoch = 300;\n    var t0 = chrono::Clock();\n\n    for i in 0 to epoch {\n      MatrixMultiply\u003c|grid_shape, block_shape|\u003e(A, B, C);\n    }\n    gpu::Synchronize(); // 后面会改为更为通用的名字\n\n    var t1 = chrono::Clock();\n    t0.PrintLine();\n    t1.PrintLine();\n\n    var flops = 2 * a_shape[0] * a_shape[1] * b_shape[1];\n    var giga_flops = (flops.Cast\u003cf32\u003e() * 1.0e-9 * epoch.Cast\u003cf32\u003e()) / (t1 - t0);\n    giga_flops.Print();\n    \"GFlop/s\".PrintLine();\n}\n```\n\n可以搜索*.prajna文件查看\n\n## 般若生态路线图\n\n下面是般若及其相关生态的路线图, 作者粗略地分为了下面的四个阶段.\n\n```mermaid\ntimeline\n    title 般若生态路线图\n    般若编程语言: 编译器实现: GPU/异构编程: IDE\n    波罗蜜多运行时: 张量计算优化: 自动微分: 符号计算\n    框架: 数学库: 神经网络库: AutoML\n    应用: 视觉/语音/NPL: 自动驾驶: 多模态大模型\n```\n\n般若编程语言及其相关生态的建设是漫长和困难的. 般若编程语言的设计开发是整个生态的第一步, 也是最重要的一步, 目前已处于完善阶段.\n\n## 般若相关技术\n\n下图是一个般若会涉及到的相关技术思维导图, 重构人工智能基础设施并非把现有的东西全部否定, 恰恰相反现有的相关开源项目依然占据重要位置.\n般若社区扮演的更多的是设计,整合和改善的角色. 比如编译的实现, 我们只会去设计编程语言的语法, 而编译器的后端会使用LLVM项目. 而第二阶段的张量计算优化, 我们初期会直接使用MLIR/TVM等项目. 在IDE方面, 我们会增加VSCode和Jupyter的支持. 正是得益于这些开源项目, 般若生态路线图才能稳固快速的推进.\n\n```mermaid\nmindmap\n  root((Prajna))\n    Backend\n      LLVM\n        Nvptx\n        AMDGpu\n      Wasmtime\n    Paramita Runtime\n        Tensor Computing Optimization\n          Polyhedral Optimization\n          TVM\n          MLIR\n        Auto Diff\n        Symbol Compute\n    Framework\n      Nerual Networks\n      Mathmatics Tools\n    IDE\n      Vscode\n        ISP\n        Debug\n      Jupyter\n        PyWidgets\n        Notebook\n\n\n```\n\n## 般若生态会给人工智能基础设施带来什么样的变化\n\n### 快速迭代, 提升效率\n\n因为研究,训练,部署三个阶段都可以使用Prajna, 我们不需要再把模型从Pytorch中抽离出来, 也不需要把python代码转换为C++代码去部署. 这使得我们的研发,训练和部署流程可以更快的迭代.\nPrajna本身改进了C++和Python的很多缺点, 也会使开发效率有所提升.\n\n### 无需适配, 到处运行\n\n不同于Pytorch和Tensorflow在框架层去适配不同的硬件, Prajna会在编译层面去适配各种GPU和TPU. 甚至分布式计算也会由编译器自动处理,\n这意味着Prajna的适配工作在编译器阶段就已经完成, 程序可以直接在CPU, GPU, TPU和集群上直接运行.\n\n### 避免碎片化, 使TPU可编程化\n\n目前很多芯片厂商都在以工具链的形式去适配Pytorch, Tensorflow和Jax等框架, 这除了工作量巨大之外还不具备可维护性.\n而在般若生态里, 硬件厂商只需要适配类似LLVM的后端即可, 这部分工作本身也是不可避免的.\n\n除此之外, 还能使TPU可编程化, 这也使得我们的TPU能应用到更多场景.\n\n### 人工智能改善基础设施, 基础设施促进人工智能的发展\n\n般若编译器有着非常清晰的模块和层次, 人工智能不止可以生成Prajna的代码, 还可以操作Prajna的中间表示, 选择编译器优化策略等.\n这些都直接提升般若生态的能力, 般若生态的提升也会进一步促进人工智能的发展.\n\n### 般若生态的其他影响\n\n般若生态的本质是为算力提供简单高效的使用方式, 很多行业都会因此而受益. 例如:\n\n* 科学计算\n* 有限元分析\n* 办公统计软件\n\n## 与其他项目比较\n\n### 英伟达的CUDA\n\nCUDA仅支持英伟达自己的GPU, 虽然目前般若也只支持英伟达GPU, 但Prajna后期会加入对其他GPU和TPU的支持.\n\n### OpenAI的Triton\n\n本质上还是Python上的拓展, 无法避免Python本身的弊端, 也不利于自动驾驶, 物联网行业的部署.\n\n### Pytorch/Tensorflow\n\nPytorch/Tensorflow项目代码过于庞大混乱, 基础架构和框架耦合在一起, 般若生态会着清晰的架构, 在合适的地方处理问题\n\n## 文档\n\n可以查阅[般若编程语言指南](docs/般若编程语言指南.md)来进一步了解.\n\n## 在线体验[![Binder](https://mybinder.org/badge_logo.svg)](\u003chttps://mybinder.org/v2/gh/matazure/prajna-notebooks/HEAD?labpath=%2Fprajna%2Fdocs%2Fnotebooks%2Fhello_world.ipynb\u003e)\n\n点击\"launch binder\"按钮来快速在线体验般若编程语言.\n\n## docker\n\n还可以直接下载已经安转Prajna的docker来直接体验.\n\n```bash\ndocker pull matazure/prajna:0.1.0-cpu-ubuntu20.04\ndocker run -ti matazure/prajna:0.1.0-cpu-ubuntu20.04 prajna repl\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprajna-lang%2Fprajna","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprajna-lang%2Fprajna","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprajna-lang%2Fprajna/lists"}