ChatGPT和Claude 对比测试(以Review MLIR Codegen代码为例)

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),也就是:

def EliminateAllocOpsPass : Pass<"eliminate-alloc-ops", "ModuleOp"> {let summary = "";let constructor = "mlir::oneflow::createEliminateAllocOpsPass()";let dependentDialects = ["pdl_interp::PDLInterpDialect", "pdl::PDLDialect"];
}def AppendOneFlowStreamPass : Pass<"append-ofstream", "ModuleOp"> {let summary = "append oneflow stream to gpu function arguments";let constructor = "mlir::oneflow::createAppendOneFlowStreamPass()";
}def MgpuToOneFlowStreamPass : Pass<"mgpu-to-ofstream", "ModuleOp"> {let summary = "convert mlir abi about mgpu to oneflow stream, this pass should be invoked after append-ofstream pass";let constructor = "mlir::oneflow::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:

在这里插入图片描述

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"Constraint IsFuncArguments(value: Value) [{return success(llvm::dyn_cast<mlir::BlockArgument>(value));
}];Pattern {let alloc = op<memref.alloc>();let copy = op<memref.copy>(alloc.0, arg: IsFuncArguments);rewrite alloc with {erase copy;replace alloc with arg;};
}

接下来,我们分别对比一下newbing和chatgpt对它的分析结果。

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

个人感觉这个解释是非常强大且精准的,Claude的答案非常惊艳。

0x2.2 AppendOneFlowStreamPass

接下来我们看一下AppendOneFlowStreamPass的实现,这个实现是在oneflow/ir/lib/OneFlow/Transform/OneFlowStream.cpp这个文件,具体代码如下:

struct AppendOneFlowStreamPattern final : public OpRewritePattern<func::FuncOp> {public:explicit AppendOneFlowStreamPattern(mlir::MLIRContext* context): OpRewritePattern<func::FuncOp>(context, /*benefit=*/0) {}mlir::LogicalResult matchAndRewrite(func::FuncOp op,mlir::PatternRewriter& rewriter) const override {auto ptr_type = LLVM::LLVMPointerType::get(IntegerType::get(rewriter.getContext(), 8));if (llvm::dyn_cast<LLVM::LLVMPointerType>(op.getFunctionType().getInputs().back()))return success();llvm::SmallVector<Type> new_operand_type;for (auto type : op.getFunctionType().getInputs()) { new_operand_type.push_back(type); }new_operand_type.push_back(ptr_type);auto function_type =rewriter.getFunctionType(new_operand_type, op.getFunctionType().getResults());auto func = rewriter.create<func::FuncOp>(op.getLoc(), op.getName(), function_type);for (auto pair : op->getDialectAttrs()) { func->setAttr(pair.getName(), pair.getValue()); }op.getBody().addArgument(ptr_type, func->getLoc());IRMapping bvm;op.getRegion().cloneInto(&func.getRegion(), bvm);rewriter.eraseOp(op);return success();}
};

c++代码newbing(chatgpt)按道理可以看懂了,我们让它分析一下:

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

非常强大,给出的解释大多比较精准,并且似乎Claude真的完全理解了这段代码的逻辑。我们需要注意的是,这段代码是我同事今天才写的,模型的泛化性真的很好。

MgpuToOneFlowStreamPass

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

struct MgpuToOneFlowStreamPattern final : public OpRewritePattern<LLVM::CallOp> {public:explicit MgpuToOneFlowStreamPattern(mlir::MLIRContext* context): OpRewritePattern<LLVM::CallOp>(context, /*benefit=*/0) {}mlir::LogicalResult matchAndRewrite(LLVM::CallOp op,mlir::PatternRewriter& rewriter) const override {auto ptr_type = LLVM::LLVMPointerType::get(IntegerType::get(rewriter.getContext(), 8));auto func = op->getParentOfType<LLVM::LLVMFuncOp>();auto callee = op.getCallee();if (!func || !callee) return failure();Value stream = func.getArguments().back();if (stream.getType() != ptr_type) {LOG(ERROR) << "failed to find stream in llvm.func block arguments";return failure();}DenseMap<StringRef,std::pair<std::function<bool(LLVM::CallOp&, Value&)>,std::function<void(mlir::PatternRewriter&, LLVM::CallOp&, Value&)>>>oneflow_abi = {{"mgpuStreamCreate",{[](LLVM::CallOp& op, Value& stream) { return true; },[](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {rewriter.replaceOp(op, {stream});}}},{"mgpuLaunchKernel",{[](LLVM::CallOp& op, Value& stream) {unsigned idx = op->getNumOperands();return op.getOperand(idx - 3) != stream;},[](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {unsigned idx = op->getNumOperands();auto target = op.getOperand(idx - 3).getDefiningOp();rewriter.replaceOp(target, {stream});}}},{"mgpuStreamSynchronize",{[](LLVM::CallOp& op, Value& stream) { return true; },[](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {rewriter.eraseOp(op);}}},{"mgpuStreamDestroy",{[](LLVM::CallOp& op, Value& stream) { return true; },[](mlir::PatternRewriter& rewriter, LLVM::CallOp& op, Value& stream) {rewriter.eraseOp(op);}}},};auto out = oneflow_abi.find(callee.value().str());if (out != oneflow_abi.end() && out->getSecond().first(op, stream)) {out->getSecond().second(rewriter, op, stream);}return success();}
};

还是先让chatgpt分析下:

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

0x3. 总结

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

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

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

在这里插入图片描述

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

EliminateAllocOpsPass

接下来问问 EliminateAllocOpsPass 的实现:

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

在这里插入图片描述

AppendOneFlowStreamPattern

在这里插入图片描述
在这里插入图片描述

对比下Claude:

在这里插入图片描述

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

接下来是细节分析。

在这里插入图片描述
在这里插入图片描述
对比下Claude

在这里插入图片描述Claude的解释再次击败了ChatGPT

在这里插入图片描述
对比下Claude

在这里插入图片描述可以看到Claude的结果显然也是更优的,不仅为我们解释了所有细节还列出了用到的MLIR相关属性和接口。

MgpuToOneFlowStreamPass

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

在这里插入图片描述
对比Claude

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

在这里插入图片描述
感觉和Claude差不多。

结论2

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5722.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Z-library 官方正式回归!

上一次写 Z-library 这个网站&#xff0c;还是在年前&#xff0c;当时 Z-lib 的主域名被美国官方搞了后&#xff0c;被迫转移到了深层网络。 但关于 Z-lib 的故事并没有结束&#xff0c;而是在压力重重下&#xff0c;这个神仙站里的内容被国内外的无数团队、无数项目续上了命。…

阿里云轻量服务器 利用宝塔面板 为域名部署SSL证书

除了在Lets Encrypt网站制作服务器SSL证书以外&#xff0c;阿里云上申请SSL证书的步骤更加的简单。以下先给出前者的教程博客&#xff0c;感兴趣的可以移步观看 申请Let‘s Encrypt永久免费SSL证书_栗少的博客-CSDN博客_letsencrypt 一、在阿里云平台进行域名置购和备案&…

Linux 禁用23端口

禁用23端口 文章目录 前言检查23端口是否被占用正常情况&#xff1a;23端口是没有被使用的。特殊情况&#xff1a;不排除个别系统使用了23端口。 看看 ChatGpt 是怎么处理的&#xff1f;步骤一&#xff1a;vim /etc/services 编辑&#xff0c;禁用23端口是必要的。:wq保存修改。…

Docker翻脸暂停账户,强制收费,不再开源!

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 作者 | 王瑞平 来自&#xff1a;51CTO技术栈 前几日&#xff0c;Docker Hub出了一件大事&#xff01;但凡创建了“organisation”的用户都收到了一封含有简短PDF链接的邮件。邮件的内容“金钱味”十足&…

意大利禁用ChatGPT! AI工具使用是否应该被限制?

​*以下部分内容来源于公众号&#xff1a;南风窗 OpenAI GPT大模型引领全球AI创新热潮&#xff0c;但其新技术之下 “矛“与”盾”也日益严重。 一、意大利封禁ChatGPT&#xff0c;全面调查隐私问题 就在前几天&#xff0c;Italy突然下令&#xff0c;封禁ChatGPT&#xff01; …

当创业者开始用 ChatGPT 裁员

几个月来&#xff0c;对话机器人 ChatGPT 展现出的能力令世界惊叹。 它能够轻而易举地完成人类的工作&#xff1a;无论是写出华尔街日报风格的文章、还是接到需求后敲出流畅的代码&#xff0c;甚至仅靠手写稿纸就自动生成网站等等。当它高分通过人类的律法、外语、高考等考试时…

GPT-4为通过人机验证,试图雇人给自己打工,还骗了对方

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 重磅干货&#xff0c;第一时间送 机器之心 GPT-4 在律师考试能拿 90% 成绩&#xff0c;SAT 能上常青藤&#xff0c;谁说它就不能骗人&#xff1f; 在 GPT-4 推出以后&#xff0c;OpenAI 首席执行官 Sam Altman 表示&…

有点慌了!ChatGPT可能影响80%工作岗位!

机器之心报道 机器之心编辑部 ChatGPT 的影响涵盖所有收入阶层&#xff0c;且高收入工作可能面临更大的风险。 ChatGPT 来了&#xff0c;失业还会远吗&#xff1f;上星期在 GPT-4 发布时&#xff0c;ChatGPT 第一时间上线了新版本&#xff0c;OpenAI 首席执行官 Sam Altman 表示…

OpenAI重磅研究:ChatGPT可能影响80%工作岗位

划重点&#xff1a; 1研究人员估计 ChatGPT 和使用该程序构建的未来应用可能影响美国大约 19% 的工作岗位&#xff0c;和他们至少 50% 的工作任务。与此同时&#xff0c;80% 的美国劳动力至少有 10% 的工作任务在某种程度上将受到 ChatGPT 的影响。 2通过分析他们发现&#xff…

OpenAI重磅研究:ChatGPT可能影响80%工作岗位,收入越高影响越大

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 重磅干货&#xff0c;第一时间送 来自&#xff1a;机器之心 ChatGPT 的影响涵盖所有收入阶层&#xff0c;且高收入工作可能面临更大的风险。 ChatGPT 来了&#xff0c;失业还会远吗&#xff1f;上星期在 GPT-4 发布时…

ChatGPT 开源了第一款插件,都来学习一下源码吧~

3 月 23 日&#xff0c;OpenAI 又投出了一枚重磅炸弹&#xff1a;为 ChatGPT 推出插件系统&#xff01; 此举意味着 ChatGPT 将迎来“APP Store”时刻&#xff0c;也就是围绕它的能力&#xff0c;形成一个开发者生态&#xff0c;打造出基于 AI 的“操作系统”&#xff01; 插…

如何使用ChatGPT处理excel

用ChatGPT处理excel&#xff0c;我们需要用到的主要工具是ChatGPT和vba代码。 VBA代码是一种用于Excel&#xff0c;Word&#xff0c;PPT的Microsoft Office软件的编程语言。 可以让用户通过编写一些简单的指令和操作&#xff0c;实现自动化、自定义和数据处理等功能。 就像你编…

用ChatGPT生成Excel公式,太方便了!

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 每天 14:00 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来&#xff0c;这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布&#xff0c;不少网友更是痴迷到通宵熬夜和它对话聊天&#xff0c;就为了探究 ChatGPT 的应用天花板在哪里&#xff0c;经过试探不少人发现&#xff0c…

chatgpt赋能python:Python中如何生成表格

Python中如何生成表格 在数据分析和处理中&#xff0c;表格是一种常见的数据格式&#xff0c;并且在不同的场景下都有着不同的用途。Python作为一种高效的编程语言&#xff0c;可以帮助我们轻松地生成和操作表格数据。在本文中&#xff0c;我们将介绍Python中生成表格的方法&a…

【ChatGPT实战】7.使用ChatGPT自动化操作Excel

使用ChatGPT自动化操作Excel&#xff01;现在可以借助ChatGPT让我们操作表格更加智能化、高效化。无需手动操作&#xff0c;提高你的工作效率并减少出错率。如果你经常使用Excel&#xff0c;这将是一项非常实用的技能。下面我将向你展示如何使用ChatGPT自动化Excel操作&#xf…

短信验证码和邮箱验证码

目录 一、短信发送验证码 1、准备工作 2、项目整合容联云 2.1 引入依赖 2.2 编写配置文件&#xff0c;修改启动类 2.3.1 创建常量类 2.3.2、封装验证码生成类 2.3.3、Controller 层 2.3.4、Service层 二、邮箱验证码 1、准备工作 2、整合邮箱服务 1、引入依赖 2、开…

邮箱接收验证码登录

开发工具与关键技术&#xff1a;VS NVC 作者:听民谣的老猫 撰写时间&#xff1a;2019/7/25 11:07 已经讲过通过账号密码来进行用户的登录,今天就来讲讲邮箱发送动态密码实现用户登录。 再讲这个功能之前你得去QQ邮箱获取一下授权码。 首先登录自己的QQ邮箱&#xff0c;找…

表单账号,密码,邮箱验证登录

1.要求代码实现如下&#xff1a; “账号”和“密码”为必填项且自动获得光标焦点&#xff1b; 设置“密码”由字母开头&#xff0c;长度为6-10&#xff0c;仅包含数字&#xff0c;字母和下划线&#xff1b; “邮箱”检查其格式的合法性。 代码如下&#xff1a; <html&g…

谷歌邮箱(@gmail.com):两步验证+应用专用密码登录

Gmail是Google出品的邮箱&#xff0c;有普通邮箱&#xff08;Gmail.com&#xff09;&#xff0c;也有企业邮箱&#xff08;谷歌企业套件&#xff09; 本文将详细讲解&#xff1a;如何在第三方客户端绑定谷歌邮箱&#xff08;Gmail&#xff09;进行邮件收发&#xff1f; 由于环境…