0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Claude在MLIR代码分析上完全超越了ChatGPT并表现十分惊艳

jf_pmFSk4VX 来源:GiantPandaCV 2023-04-24 14:28 次阅读

Claude在MLIR代码分析上完全超越了ChatGPT并表现十分惊艳,请阅读全文或者自己注册感受它的强大。结论:在本文的任务中,Claude > ChatGPT >> NewBing

0x0. 前言

这里将以oneflow IR部分中的一个Codegen任务(目标是在mlir codegen中支持oneflow stream,用oneflow stream替换pass中自己生成的stream,PR链接为:https://github.com/Oneflow-Inc/oneflow/pull/10149)为例,来对比一下newibing(chatgpt)和claude对mlir的理解能力。claude是Anthropic公司推出的类似于chatgpt的聊天机器人,这家公司是OpenAI的最大竞争对手之一,因为创办这家公司的人也是OpenAI的前员工。然后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:

2dfe90ee-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

newbing直接看不懂,其实我感觉claude也应该看不懂吧,抱着怀疑的态度问一下。

2e111e12-de7c-11ed-bfe3-dac502259ad0.png

2e1af2de-de7c-11ed-bfe3-dac502259ad0.png

太疯狂了,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对它的分析结果。

2e242188-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

newbing并不能解析出这段代码是MLIR的PDL语言,当然也无法理解代码内容。我们可以再使用Claude试试。

2e2e9d52-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

2e36e69c-de7c-11ed-bfe3-dac502259ad0.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)按道理可以看懂了,我们让它分析一下:

2e3d7f84-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

直接问chatgpt,它还是不懂这段代码。我手动提示了下它说,这段代码定义了一个mlir pattern,然后它先是重复我的话给出了一段回答。然后接下来就是胡说八道了,在这个例子中表现很差。接下来我们拷问一下Claude:

2e487fa6-de7c-11ed-bfe3-dac502259ad0.png

2e52e428-de7c-11ed-bfe3-dac502259ad0.png

我们继续问一下c++代码中的一些细节:

2e5a5e4c-de7c-11ed-bfe3-dac502259ad0.png

2e620bd8-de7c-11ed-bfe3-dac502259ad0.png

非常强大,给出的解释大多比较精准,并且似乎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分析下:

2e6e32dc-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

回答还是比较模棱两可,并且可以确定的事情是chatgpt完全没有理解这段代码。

接下来还是使用Claude来测试下:

2e77c16c-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

这个地方让我震惊的点是,它不仅理解了这段代码,而且知道在MLIR里面这段代码只是一个Pattern规则,如果要应用这个规则需要在MLIR里面再构建一个Pass。最后我们再让Claude给我们一些Review意见:

2e81ba8c-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

这里的第4点提示让我感到有些疑惑,我还请教了下同事,顺便让同事补充一下注释。

2e8889ca-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

整体来说,在阅读MLIR代码方面,Claude已经相当智能,全面领先Newbing(Chatgpt),感觉以后可以日常用Claude来辅助Review IR相关代码。

0x3. 总结

我这里以MLIR的一个任务对比了一下ChatGpt和Claude,我感受到了Calude的强大之处。虽然暂时还没有评测过别的任务,但我已经被Calude表现出来的代码分析能力所震撼。我们甚至可以将Claude作为一个入门AI编译器的入门工具

--------------------------------分割线-------------------------------------

评论区有朋友提出newbing的一些功能被限制了,并不等价于chatgpt3.5,我借了一个官方的chatgpt账号重新测试了一下,以下是测试结果:

2e97d36c-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

2ea0b2fc-de7c-11ed-bfe3-dac502259ad0.png



就这个例子来说,chatgpt的解释没有Claude那么细节,Claude的结果确实比chatgpt的好一点,不过chatgpt确实知道这个是MLIR的Pass,不像newbing那样被限制。

EliminateAllocOpsPass

接下来问问 EliminateAllocOpsPass 的实现:

2eaa1bb2-de7c-11ed-bfe3-dac502259ad0.png

2eb346a6-de7c-11ed-bfe3-dac502259ad0.png



我们可以对比下上面Calude的结果,感觉针对这个问题ChatGPT的描述以及理解是不如Claude那么自然的。从这个回答里面我们并不能看出ChatGPT理解了这个实现的原理,而Claude则完全理解了。

2e36e69c-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

AppendOneFlowStreamPattern

2ec51750-de7c-11ed-bfe3-dac502259ad0.png

2ecddc32-de7c-11ed-bfe3-dac502259ad0.png

对比下Claude:

2e52e428-de7c-11ed-bfe3-dac502259ad0.png

在这里插入图片描述

可以看到Claude的分析比ChatGPT好很多,它明确的知道if (llvm::dyn_cast(op.getFunctionType().getInputs().back())) 这行代码是检查当前函数是否已经有Stream参数,而ChatGPT的回答则不知道这个指针类型的参数就代表Stream。

接下来是细节分析。

2ee601b8-de7c-11ed-bfe3-dac502259ad0.png

2eeef05c-de7c-11ed-bfe3-dac502259ad0.png

对比下Claude

2e5a5e4c-de7c-11ed-bfe3-dac502259ad0.png

Claude的解释再次击败了ChatGPT

2f038170-de7c-11ed-bfe3-dac502259ad0.png

对比下Claude

2e620bd8-de7c-11ed-bfe3-dac502259ad0.png

可以看到Claude的结果显然也是更优的,不仅为我们解释了所有细节还列出了用到的MLIR相关属性和接口

MgpuToOneFlowStreamPass

我们最后再分析下MgpuToOneFlowStreamPass的实现。

2f17f79a-de7c-11ed-bfe3-dac502259ad0.png

对比Claude

2e77c16c-de7c-11ed-bfe3-dac502259ad0.png

Claude的结果也显著优于ChatGPT,并且可以发现ChatGPT的回答里面还漏掉了一个mgpuStreamSynchronize ABI。最后,我们再问一下ChatGPT能不能给出一些修改意见。

2f2e9e96-de7c-11ed-bfe3-dac502259ad0.png

感觉和Claude差不多。

结论2

整体来看,在这个Review MLIR代码的任务中,Claude > ChatGPT >> NewBing

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 聊天机器人
    +关注

    关注

    0

    文章

    333

    浏览量

    12295
  • ChatGPT
    +关注

    关注

    29

    文章

    1550

    浏览量

    7514

原文标题:结论2

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    十分

    谁能帮我看看VHDL编的十分频图里19行以下不理解了。一上升沿q就等于1啊?怎么变0
    发表于 08-31 09:46

    十分钟学会ISE

    十分钟学会ISE
    发表于 03-26 09:39

    十分钟学会ISE

    十分钟学会ISE
    发表于 09-05 22:49

    IC设计/验证中怎么应用ChatGPT呢?

    好用,那么对于工程师群体应该帮助很大!按照官网的介绍,工程师们完全可以把所要实现的逻辑步骤用自然语言描述清楚,然后ChatGPT会翻译出满足相应要求的代码进行实现。话不多说,如图2直接上干货进行测试!图
    发表于 02-21 15:16

    科技大厂竞逐AIGC,中国的ChatGPT在哪?

    产业版ChatGPT--ChatJD。 可见,大厂的态度十分鲜明:ChatGPT已经是既定的未来,这场新的科技竞技赛哨声响起,谁都不甘落于下风。从科技巨头,到行业龙头,中国企业竞逐AI赛道,AIGC(利用
    发表于 03-03 14:28

    十分钟学会Xilinx FPGA 设计

    十分钟学会Xilinx FPGA 设计 Xilinx FPGA设计基础系统地介绍Xilinx公司FPGA的结构特点和相关开发软件的使用方法,详细描述VHDL语言的语法和设计方法,
    发表于 03-15 15:09 178次下载

    红魔Mars游戏性能实测 表现十分稳定

    红魔Mars游戏性能实测 表现十分稳定
    的头像 发表于 07-02 11:20 5351次阅读

    AI编译器:ChatGptClaude有何区别

    整体来说,阅读MLIR代码方面,Claude已经相当智能,全面领先Newbing(Chatgpt),感觉以后可以日常用
    发表于 04-19 10:23 1784次阅读

    ClaudeMLIR代码分析完全超越ChatGPT

    EliminateAllocOpsPass用来消除IR中的无效memref.alloc指令,AppendOneFlowStreamPass给GPU相关的函数添加GPU启动kernel需要的stream参数,MgpuToOneFlowStreamPass发生在AppendOneFlowStreamPass执行之后(它生成了stream参数)并把mgpu相关的stream abi替换为oneflow stream abi。
    的头像 发表于 04-19 10:25 1266次阅读

    如何设计MLIR的Dialect来GPU生成高性能的代码

    为什么又要开一个新坑?原因是,最近在做的项目都是和MLIR有关,并且发现自己已经MLIR的研发道路上越走越远了。
    的头像 发表于 05-10 14:57 1784次阅读
    如何设计<b class='flag-5'>MLIR</b>的Dialect来<b class='flag-5'>在</b>GPU<b class='flag-5'>上</b>生成高性能的<b class='flag-5'>代码</b>?

    ChatGPT最强竞品Claude2来代码、GRE 成绩超越GPT-4,免费可用

    机器之心在此前的文章中多次介绍过 Claude,它是由 OpenAI 离职人员创建的 Anthropic 公司打造的。 ChatGPT 发布两个月后,该公司就迅速开发出了 Claude
    的头像 发表于 07-14 15:21 956次阅读
    <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,免费可用

    你的自选股里,99%的ChatGPT概念股没有技术含量

    Claude是人工智能初创公司Anthropic发布的一款类似ChatGPT的软件,它的创始团队基本都是来自OpenAI,被谷歌注资。从体验上来说,是目前仅次于
    的头像 发表于 08-14 11:36 872次阅读
    你的自选股里,99%的<b class='flag-5'>ChatGPT</b>概念股没有技术含量

    如何适配新架构?TPU-MLIR代码生成CodeGen全解析!

    背景介绍TPU-MLIR的CodeGen是BModel生成的最后一步,该过程目的是将MLIR文件转换成最终的Bmodel。本文介绍CodeGen的基本原理和流程,记录了针对BM16
    的头像 发表于 11-02 08:34 1650次阅读
    如何适配新架构?TPU-<b class='flag-5'>MLIR</b><b class='flag-5'>代码</b>生成CodeGen全解析!

    Anthropic 发布 Claude 3 系列大模型和 AI 助手

    表现超越 GPT-4/3.5 和 Gemini 1.0 Ultra/Pro。   目前Opus 和 Sonnet 已可通过 claude网站和
    的头像 发表于 03-08 12:29 411次阅读

    Claude 3 Haiku模型Amazon Bedrock正式可用

    ,其中Claude 3 Haiku模型已经亚马逊云科技的Amazon Bedrock平台上正式上线,为用户提供更快速、更紧凑的生成式人工智能体验。
    的头像 发表于 03-19 11:12 718次阅读