Claude在MLIR代码分析上完全超越了ChatGPT并表现十分惊艳,请阅读全文或者自己注册感受它的强大。
0x0. 前言
这里将以oneflow IR部分中的一个Codegen任务(目标是在mlir codegen中支持oneflow stream,用oneflow stream替换pass中自己生成的stream,PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149)为例,来对比一下chatgpt和claude对mlir的理解能力。claude是Anthropic公司推出的类似于chatgpt的聊天机器人,这家公司是OpenAI的最大竞争对手之一,因为创办这家公司的人也是OpenAI的前员工。本次使用的chatgpt可以在这个 https://chatbot.theb.ai/#/chat/1002 访问。然后Claude是参考这个issue: https://www.zhihu.com/question/594115372/answer/2988759047 将其直接添加到slack里进行对话。
0x1. PR简介
PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149
这个PR实现了3个Pass (定义在 OneFlowPasses.td
),也就是:
defEliminateAllocOpsPass:Pass<"eliminate-alloc-ops","ModuleOp">{
letsummary="";
letconstructor="mlir::createEliminateAllocOpsPass()";
letdependentDialects=["pdl_interp::PDLInterpDialect","pdl::PDLDialect"];
}
defAppendOneFlowStreamPass:Pass<"append-ofstream","ModuleOp">{
letsummary="appendoneflowstreamtogpufunctionarguments";
letconstructor="mlir::createAppendOneFlowStreamPass()";
}
defMgpuToOneFlowStreamPass:Pass<"mgpu-to-ofstream","ModuleOp">{
letsummary="convertmlirabiaboutmgputooneflowstream,thispassshouldbeinvokedafterappend-ofstreampass";
letconstructor="mlir::createMgpuToOneFlowStreamPass()";
}
EliminateAllocOpsPass用来消除IR中的无效memref.alloc指令,AppendOneFlowStreamPass给GPU相关的函数添加GPU启动kernel需要的stream参数,MgpuToOneFlowStreamPass发生在AppendOneFlowStreamPass执行之后(它生成了stream参数)并把mgpu相关的stream abi替换为oneflow stream abi。
我们分别使用newbing和claude来让它们分析一下这几行OneFlowPasses.td
中定义的Pass意图:
newbing:
![bee91486-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvmAbXKWAAK8L72UQMA528.png)
newbing直接看不懂,其实我感觉claude也应该看不懂吧,抱着怀疑的态度问一下。
太疯狂了,claude不仅读懂了td文件的代码,甚至为我们列出了这个代码涉及到的MLIR概念。感觉是训练数据考虑了MLIR相关的预料?接下来我们再对比下C++实现的Pass代码。
0x2. 对比具体实现
PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149
0x2.1 EliminateAllocOpsPass
EliminateAllocOpsPass使用MLIR提供的PDL语言来完成Pattern的匹配和重写,具体实现在 oneflow/ir/lib/OneFlow/PDLL/AllocEliminationPatterns.pdll
:
#include"OneFlow/OneFlowOps.td"
ConstraintIsFuncArguments(value:Value)[{
returnsuccess(llvm::dyn_cast(value));
}];
Pattern{
letalloc=op();
letcopy=op(alloc.0,arg:IsFuncArguments);
rewriteallocwith{
erasecopy;
replaceallocwitharg;
};
}
接下来,我们分别对比一下newbing和chatgpt对它的分析结果。
![bf354ce8-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvmABQiOAAFpG7Zop18198.png)
newbing并不能解析出这段代码是MLIR的PDL语言,当然也无法理解代码内容。我们可以再使用Claude试试。
![bf498b22-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvmAGDWYAAGFH-ulwhI600.png)
![bf5334ba-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvqAPGOeAALo79xFxXU851.png)
个人感觉这个解释是非常强大且精准的,Claude的答案非常惊艳。
0x2.2 AppendOneFlowStreamPass
接下来我们看一下AppendOneFlowStreamPass的实现,这个实现是在oneflow/ir/lib/OneFlow/Transform/OneFlowStream.cpp
这个文件,具体代码如下:
structAppendOneFlowStreamPatternfinal:publicOpRewritePattern{
public:
explicitAppendOneFlowStreamPattern(mlir::MLIRContext*context)
:OpRewritePattern(context,/*benefit=*/0) {}
mlir::LogicalResultmatchAndRewrite(func::FuncOpop,
mlir::PatternRewriter&rewriter)constoverride{
autoptr_type=LLVM::get(rewriter.getContext(),8));
if(llvm::dyn_cast(op.getFunctionType().getInputs().back()))
returnsuccess();
llvm::SmallVectornew_operand_type;
for(autotype:op.getFunctionType().getInputs()){new_operand_type.push_back(type);}
new_operand_type.push_back(ptr_type);
autofunction_type=
rewriter.getFunctionType(new_operand_type,op.getFunctionType().getResults());
autofunc=rewriter.create(op.getLoc(),op.getName(),function_type);
for(autopair:op->getDialectAttrs()){func->setAttr(pair.getName(),pair.getValue());}
op.getBody().addArgument(ptr_type,func->getLoc());
IRMappingbvm;
op.getRegion().cloneInto(&func.getRegion(),bvm);
rewriter.eraseOp(op);
returnsuccess();
}
};
c++代码newbing(chatgpt)按道理可以看懂了,我们让它分析一下:
![bf5b1db0-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvqABrwsAAXUhdErDH0957.png)
直接问chatgpt,它还是不懂这段代码。我手动提示了下它说,这段代码定义了一个mlir pattern,然后它先是重复我的话给出了一段回答。然后接下来就是胡说八道了,在这个例子中表现很差。接下来我们拷问一下Claude:
我们继续问一下c++代码中的一些细节:
非常强大,给出的解释大多比较精准,并且似乎Claude真的完全理解了这段代码的逻辑。我们需要注意的是,这段代码是我同事今天才写的,模型的泛化性真的很好。
MgpuToOneFlowStreamPass
我们最后再分析下MgpuToOneFlowStreamPass的实现。
structMgpuToOneFlowStreamPatternfinal:publicOpRewritePattern{
public:
explicitMgpuToOneFlowStreamPattern(mlir::MLIRContext*context)
:OpRewritePattern(context,/*benefit=*/0) {}
mlir::LogicalResultmatchAndRewrite(LLVM::CallOpop,
mlir::PatternRewriter&rewriter)constoverride{
autoptr_type=LLVM::get(rewriter.getContext(),8));
autofunc=op->getParentOfType();
autocallee=op.getCallee();
if(!func||!callee)returnfailure();
Valuestream=func.getArguments().back();
if(stream.getType()!=ptr_type){
LOG(ERROR)<< "failedtofindstreaminllvm.funcblockarguments";
returnfailure();
}
DenseMapstd::pair<std::function<bool(LLVM::CallOp&,Value&)>,
std::function<void(mlir::PatternRewriter&,LLVM::CallOp&,Value&)>>>
oneflow_abi={
{"mgpuStreamCreate",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.replaceOp(op,{stream});
}}},
{"mgpuLaunchKernel",
{[](LLVM::CallOp&op,Value&stream){
unsignedidx=op->getNumOperands();
returnop.getOperand(idx-3)!=stream;
},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
unsignedidx=op->getNumOperands();
autotarget=op.getOperand(idx-3).getDefiningOp();
rewriter.replaceOp(target,{stream});
}}},
{"mgpuStreamSynchronize",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.eraseOp(op);
}}},
{"mgpuStreamDestroy",
{[](LLVM::CallOp&op,Value&stream){returntrue;},
[](mlir::PatternRewriter&rewriter,LLVM::CallOp&op,Value&stream){
rewriter.eraseOp(op);
}}},
};
autoout=oneflow_abi.find(callee.value().str());
if(out!=oneflow_abi.end()&&out->getSecond().first(op,stream)){
out->getSecond().second(rewriter,op,stream);
}
returnsuccess();
}
};
还是先让chatgpt分析下:
![bfc2a890-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvuAAvCgAAV9RZleaTY870.png)
回答还是比较模棱两可,并且可以确定的事情是chatgpt完全没有理解这段代码。
接下来还是使用Claude来测试下:
![bfcd130c-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvuAbBV7AARgv3K89_E269.png)
这个地方让我震惊的点是,它不仅理解了这段代码,而且知道在MLIR里面这段代码只是一个Pattern规则,如果要应用这个规则需要在MLIR里面再构建一个Pass。最后我们再让Claude给我们一些Review意见:
![bfd722ca-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvuACWRpAAN21gNa4gE529.png)
这里的第4点提示让我感到有些疑惑,我还请教了下同事,顺便让同事补充一下注释。
![bfed8c0e-de08-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/99/E2/wKgZomTnjvuAAaEuAAKFrVZIbwY290.png)
整体来说,在阅读MLIR代码方面,Claude已经相当智能,全面领先Newbing(Chatgpt),感觉以后可以日常用Claude来辅助Review IR相关代码。
0x3. 总结
我这里以MLIR的一个任务对比了一下ChatGpt和Claude,我感受到了Calude的强大之处。虽然暂时还没有评测过别的任务,但我已经被Calude表现出来的代码分析能力所震撼。我们甚至可以将Claude作为一个入门AI编译器的入门工具
审核编辑 :李倩
-
gpu
+关注
关注
27文章
4513浏览量
127595 -
编译器
+关注
关注
1文章
1588浏览量
48797 -
ChatGPT
+关注
关注
28文章
1496浏览量
5915
原文标题:0x3. 总结
文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
TPU-MLIR开发环境配置时出现的各种问题求解
科技大厂竞逐AIGC,中国的ChatGPT在哪?
AI编译器:ChatGpt和Claude有何区别
Claude在MLIR代码分析上完全超越了ChatGPT并表现十分惊艳
![<b class='flag-5'>Claude</b><b class='flag-5'>在</b><b class='flag-5'>MLIR</b><b class='flag-5'>代码</b><b class='flag-5'>分析</b><b class='flag-5'>上</b><b class='flag-5'>完全</b><b class='flag-5'>超越</b><b class='flag-5'>了</b><b class='flag-5'>ChatGPT</b>并表现十分惊艳](https://file1.elecfans.com/web2/M00/82/30/wKgaomRGIpKARkikAAAkCq9q8D4434.png)
ChatGPT上线最强应用:分析数据、生成代码都精通
![<b class='flag-5'>ChatGPT</b>上线最强应用:<b class='flag-5'>分析</b>数据、生成<b class='flag-5'>代码</b>都精通](https://file1.elecfans.com/web2/M00/8C/A8/wKgaomSvn2mAGc-rAAA43PzKZfk737.png)
ChatGPT最强竞品Claude2来了:代码、GRE 成绩超越GPT-4,免费可用
![<b class='flag-5'>ChatGPT</b>最强竞品<b class='flag-5'>Claude</b>2来<b class='flag-5'>了</b>:<b class='flag-5'>代码</b>、GRE 成绩<b class='flag-5'>超越</b>GPT-4,免费可用](https://file1.elecfans.com/web2/M00/8C/BF/wKgZomSw9-yAUTMsAAA2AuAUzA4114.png)
你的自选股里,99%的ChatGPT概念股没有技术含量
![你的自选股里,99%的<b class='flag-5'>ChatGPT</b>概念股没有技术含量](https://file1.elecfans.com/web2/M00/90/69/wKgaomTZoYWABu9PAABsZs4NUzM886.png)
如何适配新架构?TPU-MLIR代码生成CodeGen全解析!
![如何适配新架构?TPU-<b class='flag-5'>MLIR</b><b class='flag-5'>代码</b>生成CodeGen全解析!](https://file1.elecfans.com/web2/M00/A6/4A/wKgaomUTnHiADnB2AAAtr1gPdQM010.png)
Anthropic发布Claude 3系列,超越GPT-4和Gemini Ultra
Anthropic发布Claude 3,单词处理能力是ChatGPT近50倍
Anthropic 发布 Claude 3 系列大模型和 AI 助手
Claude 3 Haiku模型在Amazon Bedrock上正式可用
谷歌Gemini流量已追平ChatGPT的25%,但Claude、Copilot使用率仍偏低
Anthropic 发布Claude 3.5 Sonnet模型运行速度是Claude 3 Opus的两倍
![Anthropic 发布<b class='flag-5'>Claude</b> 3.5 Sonnet模型运行速度是<b class='flag-5'>Claude</b> 3 Opus的两倍](https://file1.elecfans.com//web2/M00/F2/65/wKgaomZ1LxaAP-0NAABPmKf6CAY918.png)
评论