当前位置: 首页 > news >正文

河南平顶山网站建设公司零售商城

河南平顶山网站建设公司,零售商城,网站创建知识,上传户型图生成效果图本文构造了20个MLIR基础概念的问题以及使用OneFlow IR转换为Tosa IR的5个代码段来评测GPT4和Claude对于MLIR的掌握能力#xff0c;我的结论是对于基础概念的理解Claude整体上和GPT4持平#xff0c;而在阅读相关代码片段时Claude表现出了比GPT4更强一点的理解能力。 0x0. 前言… 本文构造了20个MLIR基础概念的问题以及使用OneFlow IR转换为Tosa IR的5个代码段来评测GPT4和Claude对于MLIR的掌握能力我的结论是对于基础概念的理解Claude整体上和GPT4持平而在阅读相关代码片段时Claude表现出了比GPT4更强一点的理解能力。 0x0. 前言 前面的文章中以Review一段MLIR相关的Pass代码为例子对比了ChatGPT3.5ClaudeNewBing在该任务上的理解能力。我得出的结论是在该MLIR的相关任务上ClaudeChatGPT3.5Newbing评论区有人指出GPT4 Clude。我感觉上次的任务设计得不是特别好并没有充分考察ChatGPT和Claude对MLIR的一些核心概念的理解。然后我今天借到了一个GPT4的官方账号 (daquexian 大老师提供的)我打算更全面的对比一下GPT4和Claude在对MLIR的掌握能力。接下来将从MLIR基础概念以及一个OneFlow IR转换为TOSA IR的任务出发更全面的评价GPT4和Claude对于MLIR的掌握能力。 0x1. MLIR基础概念 Q1: MLIR中的IR是什么为什么需要多层IR ChatGPT4的回答 Claude回答 对于MLIR中的IR是什么GPT4的回答更好一些然后对于为什么需要多层IR这个问题Claude相比于GPT4更加细节一点。 Q2. 介绍一下MLIR Dialect的概念并描述一下Dialect的相关组件。 GPT4: Claude 对于这个问题GPT4的回答非常干净准确而Claude虽然看起来更细节一些但是总结得让人看起来很乱。 Q3: 在MLIR中如何定义和实现一个新的Dialect? GPT4 按照GPT4给出的步骤基本可以自定义一个Dialect以及相关的组件不过现在一般对于Dialect以及Operation甚至Pass的定义都依靠了MLIR的ODS系统在相应的*.td文件中定义并自动生成C代码更加方便和通用。这里还可以发现GPT4在列举结果的时候序号一直是1并没有递增不知道是不是BUG。 可以再看一下Claude的结果 Claude的结果和GPT4的结果没有GPT4那么细节比如GPT4把头文件的位置都列出来了但是整体的步骤和GPT4基本一样也算是比较好的理解了这个问题。 Q4: 介绍一下MLIR Dialect中的ModuleOp, FuncOp, Block GPT4 Claude GPT4的回答相比于Claude主要多了几个代码示例但主体的内容两者是基本一样的。 Q5: 介绍一下MLIR Dialect中的Operation, Value, Type, Attribute GPT4 对概念的解释还是比较准确的接下来看下Claude的结果 对于这个问题感觉Claude的回答是要比GPT4的回答好一点的。 为了进一步对比上述概念的理解我们以MLIR的Toy Dialect示例中的transpose op定义为例让GPT4和Claude分别详细解释下代码。 Q6: 详细解释下这行代码。%t_tensor toy.transpose(%tensor) {inplace true} : (tensor2x3xf64) - tensor3x2xf64 loc(example/file/path:12:1 GPT4: Claude 我们可以看到GPT4的源码分析更加细致比如GPT4给我们解释了inplace的含义但Claude并没有。 Q7MLIR的Operation由Operation类和Op类的构成请说一下它们的区别。 并说明一下ConstantOp和mlir::Operation *operation之间应该如何转换。 GPT4: Claude: GPT4和Claude的回答都还不错。 Q8介绍一下MLIR Value的2个派生类BlockArgument和OpResult并说明一下Value和mlir::Operantion *operation之间如何相互转换。 Claude 对于Value的基础概念GPT4和Claude都理解得不错。 Q9: 介绍一下mlir::Typemlir::ShapedType以及mlir::TensorType GPT4 Claude 就这个回答来说Claude的回答是超越了GPT4的。它不仅为我们解释了概念还指出这三个Type的派生类之间应该如何转换。 Q10: TensorType又可以分成RankedTensorType和UnrankedTensorType请说明一下它们的区别以及如何判断当前的TensorType是否是Ranked。 GPT4 Claude 相比于GPT4针对这个问题Claude的回答显得更好一点。主要好在它列出了RankedTensorType和UnrankedTensorType的主要成员函数并做了对比。 Q11: 介绍一下MLIR的Attribute GPT4: Claude: 对于Attribute的解释我感觉Claude也是比GPT4好一点。 Q12介绍一下MLIR的Builder和OpBuilder。 GPT4 Claude 个人感觉GPT4和Claude的回答都不是很完善如果综合一下GPT4和Claude的结果会更好这个问题双方算是平手。 Q13: 介绍一下MLIR Context和Region GPT4: Claude: 这个问题的回答感觉Claude更加准确并且Claude指出了使用Context和Region的一般构建流程。 我们知道在MLIR中定义OP有2种方式一种是直接在C定义另外一种是基于ODS进行定义。目前主流的做法就是基于ODS也就是在一个td文件中定义OP然后利用TableGen自动生成相应的C代码。MLIR在OpBase.td中已经定义了一些公共的结构接下来我们就提问GPT4和Claude是否知道这些公共的结构。 Q14: MLIR的OpBase.td有哪些公共结构 Claude: 我期待的回答应该类似于 显然GPT4和Claude都没有给出理想的答案而是随机挑选了一些OpBase.td定义的类所以这个问题并没有很好的被语言模型理解。 Q15: 解释一下TF Dialect中对AvgPool Op使用ODS进行定义涉及到的TableGen语法AvgPool Op定义的代码如下 # https://github.com/tensorflow/tensorflow/blob/master/tensorflow/compiler/mlir/tensorflow/ir/tf_generated_ops.td#L965 def TF_AvgPoolOp : TF_OpAvgPool, [Pure] {let summary Performs average pooling on the input.;let description [{ Each entry in output is the mean of the corresponding size ksize window in value.}];let arguments (insArgTF_FloatTensor, [{4-D with shape [batch, height, width, channels].}]:$value,ConfinedAttrI64ArrayAttr, [ArrayMinCount4]:$ksize,ConfinedAttrI64ArrayAttr, [ArrayMinCount4]:$strides,TF_AnyStrAttrOf[SAME, VALID]:$padding,DefaultValuedOptionalAttrTF_ConvnetDataFormatAttr, \NHWC\:$data_format);let results (outsResTF_FloatTensor, [{The average pooled output tensor.}]:$output);TF_DerivedOperandTypeAttr T TF_DerivedOperandTypeAttr0; }GPT4 Claude GPT4和Claude的结果比较类似都是逐行解析了涉及到的TableGen语法。 Q16: 请解释一下MLIR中的Bufferization GPT4: Claude: GPT4的回答宏观一些Claude的回答更具体一些都有优点。 Q17: 对于将分散的memref.alloc操作优化合并成单一的memref.alloc统一分配并通过类似memref.subview进行复用你有什么建议吗有现成的类似的pass实现吗 GPT4 Claude 对于这个问题GPT4总结得比Claude更细一些。 Q18: 讲一下MLIR中One-Shot Bufferize设计的目的和目前成熟的应用 GPT4: Claude: 两种回答差不多不分高下。 Q19: https://mlir.llvm.org/docs/Bufferization/ 这个网页你能解读一下吗 GPT4 Claude GPT4的总结稍微更贴合网页一些但是自己去浏览网页可以发现还是有一些细节被漏掉了如果要学习Bufferization还是建议去看下原始的网页。 Q20: 解释下linalg的算子融合算法 GPT4: Claude: 对Linalg的学习有限个人感觉这两个答案都是比较宏观的需要查看Linalg的文档或者代码进一步获取相关信息。 上面一共问了20个问题我个人感觉GPT4相比于Claude并没有很大的优势我的初步结论是就MLIR的基础概念理解来看GPT4和Claude几乎打成平手。 0x2. 代码阅读 这一节我以OneFlow中的OneFlow Dialect中的Op转换为TOSA Dialect中的Op为例子对比一下GPT4和Claude对相关代码的理解能力。这部分代码在 https://github.com/Oneflow-Inc/oneflow/blob/master/oneflow/ir/lib/OneFlow/Conversion/OneFlowToTosa.cpp 这个c文件中。 Code 1 解释一下 Type convertToSignless(MLIRContext* context, Type type) {if (auto ranked_tensor type.dyn_castRankedTensorType()) {if (auto intTy ranked_tensor.getElementType().dyn_castIntegerType()) {if (!intTy.isSignless()) {return RankedTensorType::get(ranked_tensor.getShape(),IntegerType::get(context, intTy.getWidth(),mlir::IntegerType::SignednessSemantics::Signless));}}}return type; }FunctionType convertToSignlessFuncType(MLIRContext* context, FunctionType funcType) {llvm::SmallVectorType, 4 inputs;llvm::SmallVectorType, 4 results;for (auto arg : funcType.getInputs()) { inputs.push_back(convertToSignless(context, arg)); }for (auto res : funcType.getResults()) { results.push_back(convertToSignless(context, res)); }return FunctionType::get(context, inputs, results); }GPT4 Claude GPT4和Claude对这段代码的解释基本相同并且都是正确的。 Code2 解释一下 bool isSignLessTensorOrOther(Type type) {if (auto ranked_tensor type.dyn_castRankedTensorType()) {if (auto intTy ranked_tensor.getElementType().dyn_castIntegerType()) {if (intTy.isUnsigned()) { return false; }if (intTy.isSigned()) { return false; }}}return true; } bool allSignless(mlir::TypeRange types) {for (auto type : types) {if (!isSignLessTensorOrOther(type)) { return false; }}return true; }bool allSignless(FunctionType funcType) {for (auto arg : funcType.getInputs()) {if (!isSignLessTensorOrOther(arg)) { return false; }}for (auto res : funcType.getResults()) {if (!isSignLessTensorOrOther(res)) { return false; }}return true; }GPT4: Claude GPT4和Claude的结果也比较类似但Claude有个优点就是它对每个函数都给出了一个例子可以帮助读者更方便的去理解这段代码的含义。 Code3 解释一下 Value CreateTransposeValue(Location loc, ConversionPatternRewriter rewriter, Value input,ArrayRefint32_t perms) {int perms_size perms.size();auto transpose_perms rewriter.createtosa::ConstOp(loc, RankedTensorType::get({perms_size}, rewriter.getI32Type()),rewriter.getI32TensorAttr(perms));const auto shape_type input.getType().castShapedType();std::vectorint64_t ranked_type;for (const auto index : perms) ranked_type.push_back(shape_type.getDimSize(index));return rewriter.createtosa::TransposeOp(loc, RankedTensorType::get(ranked_type, shape_type.getElementType()), input, transpose_perms); };RankedTensorType CreateTransposeType(ShapedType output, ArrayRefint32_t perms) {std::vectorint64_t ranked_type;for (auto index : perms) ranked_type.push_back(output.getDimSize(index));return RankedTensorType::get(ranked_type, output.getElementType()); };GPT4: Claude: 相比之下感觉Claude的解释可以胜出。 Code4 解释一下 Value CreateBNOp(Location loc, ConversionPatternRewriter rewriter, Type output_type, Value x,Value mean, Value variance, Value epsilon, Value gamma, Value beta) {// sub_op sub(input, mean)auto sub_op0 rewriter.createtosa::SubOp(loc, output_type, x, mean);// add_op0 add(var, epsilon)auto add_op0 rewriter.createtosa::AddOp(loc, variance.getType(), variance, epsilon);// rsqrt_op rsqrt(add_op0)auto rsqrt_op rewriter.createtosa::RsqrtOp(loc, variance.getType(), add_op0);// op4 mul(sub_op, rsqrt_op)auto mul_op0 rewriter.createtosa::MulOp(loc, output_type, sub_op0, rsqrt_op, 0);// op5 mul(mul_op0, gamma)auto mul_op1 rewriter.createtosa::MulOp(loc, output_type, mul_op0, gamma, 0);// op6 add(mul_op1, beta)Value batch_norm rewriter.createtosa::AddOp(loc, output_type, mul_op1, beta);return batch_norm; };GPT4: Claude: 感觉GPT4和Claude对代码的理解是一样的。 Code5 再看一个卷积Op解释一下 struct Conv2DOpLowering final : public OpConversionPatternConv2DOp {public:using OpConversionPatternConv2DOp::OpConversionPattern;LogicalResult matchAndRewrite(Conv2DOp op, OpAdaptor adaptor,ConversionPatternRewriter rewriter) const override {auto get_pair_int64_from_array [](ArrayAttr arr) - std::pairint64_t, int64_t {return {arr.getValue()[0].castIntegerAttr().getSInt(),arr.getValue()[1].castIntegerAttr().getSInt()};};auto stride_pairs get_pair_int64_from_array(op.getStrides());auto pad_pairs get_pair_int64_from_array(op.getPaddingBeforeAttr());auto dilation_pairs get_pair_int64_from_array(op.getDilationRate());const auto pad rewriter.getDenseI64ArrayAttr({pad_pairs.first, pad_pairs.second, pad_pairs.first, pad_pairs.second});const auto stride rewriter.getDenseI64ArrayAttr({stride_pairs.first, stride_pairs.second});const auto dilation rewriter.getDenseI64ArrayAttr({dilation_pairs.first, dilation_pairs.second});auto bias op.getBias();auto loc op.getLoc();if (!bias) {const auto output_shape op.getOut().getType().castShapedType();// support nhwcconst auto output_channels output_shape.getDimSize(op.IsNCHW() ? 1 : 3);const auto bias_elem_type output_shape.getElementType();const auto type RankedTensorType::get(output_channels, bias_elem_type);bias rewriter.createtosa::ConstOp(op.getLoc(), type, DenseElementsAttr::get(type, rewriter.getZeroAttr(bias_elem_type)));}auto in op.getIn();auto weight op.getWeight();auto out_type op.getOut().getType().castShapedType();if (out_type.getRank() ! 4) {LOG(FATAL) Failed to lowering oneflow op;op-dump();}// support nhwcif (op.IsNCHW()) {const auto perms {0, 2, 3, 1};const auto reverse_perms {0, 3, 1, 2};in CreateTransposeValue(loc, rewriter, in, perms);weight CreateTransposeValue(loc, rewriter, weight, perms);out_type CreateTransposeType(out_type, perms);auto conv2d rewriter.createtosa::Conv2DOp(loc, out_type, in, weight, bias, pad, stride, dilation);auto res CreateTransposeValue(loc, rewriter, conv2d, reverse_perms);rewriter.replaceOp(op, {res});} else {rewriter.replaceOpWithNewOptosa::Conv2DOp(op, out_type, in, weight, bias, pad, stride,dilation);}return success();} };GPT4: Claude: 我们再问一下为什么format为NHWC的时候要加transpose操作 可以看到Claude理解了我的问题并指出这是因为Tosa的conv2d不支持nhwc数据格式所以需要加transpose。而GPT4在这个问题上就没有理解我的意思并字面意义的重复了我的问题。 0x3. 总结 本文构造了20个MLIR基础概念的问题以及使用OneFlow IR转换为Tosa IR的5个代码段来评测GPT4和Claude对于MLIR的掌握能力我的结论是对于基础概念的理解Claude整体上和GPT4持平而在阅读相关代码片段时Claude表现出了比GPT4更强一点的理解能力。
http://www.dnsts.com.cn/news/221624.html

相关文章:

  • 个人网站免费源码wordpress无法创建目录
  • 泰州企业自助建站系统微信公众号怎么运营管理
  • 网站头像设计免费制作qq选号网站怎么做的
  • 网站建设广告词腾讯云网站建设视频
  • 网站开发开票内容58同城 网站建设 推广排名
  • 铭万做的网站怎么样农村自建房设计图app
  • 白名单网站有哪些简单的网页设计代码记事本
  • 如何建自己的个人网站互联网推广怎么学
  • icp网站建设天津哪家制作网站好
  • 华资源网站建设企业信息管理系统包括
  • 杭州建设厅官方网站北京旗网站制作
  • 深圳最大的招聘网站是什么自有服务器 建网站
  • 潞城网站建设企业网站推广过程
  • 网络游戏网站网址大全域名和网址是什么关系
  • 买的网站模板会影响wordpress 做成app
  • 天津免费建网站deppt模板网
  • wordpress 免费建站网站建设实验结论
  • 教做粥的网站建设银行泰安培训中心官方网站
  • 做系统前的浏览网站能找回吗玄武区网页设计培训
  • 团队主页 网站模板中国网站建设新闻
  • 传媒公司网站建设费入什么科目鹤壁做网站公司电话
  • 政务网站建设索引网站开发投入产出分析
  • 网站建设 配资建设介绍网站
  • 电子商务网站是什么意思wordpress 4.5.3 ueditor
  • 百度新闻源网站有哪些wordpress ip 地址修改密码
  • 临沂专业网站建设公司哪家好有做的小说网站
  • 长春建站网站模板百度建站
  • 如何开一个自己的网站php编程软件
  • 主网站怎么做熊掌号优化企业平台网
  • 企业网站报价方案win10 做网站服务器