// // MNN.fbs // MNN // // Created by jiangxiaotang on 2019/1/4. // Copyright © 2018, Alibaba Group Holding Limited // include "CaffeOp.fbs"; include "TensorflowOp.fbs"; include "TFQuantizeOp.fbs"; include "ExtraInfo.fbs"; include "UserDefine.fbs"; namespace MNN; attribute "priority"; enum OpType : int { AbsVal, QuantizedAdd, ArgMax, AsString, InstanceNorm, BatchToSpaceND, Copy, BinaryOp, Bnll, Cast, Concat, Const, Convolution, ConvolutionDepthwise, Crop, CropAndResize, ImageProcess, Deconvolution, DeconvolutionDepthwise, Dequantize, DetectionOutput, Dropout, Eltwise, ELU, Unique, Exp, ExpandDims, Fill, Flatten, Im2Col, Gather, GatherV2, Im2Seq, InnerProduct, Input, Interp, Log, LRN, LSTM, MatMul, MoE, NonMaxSuppression, NonMaxSuppressionV2, Normalize, Pack, Padding, Permute, Pooling, Power, PReLU, PriorBox, Proposal, QuantizedAvgPool, QuantizedBiasAdd, QuantizedConcat, QuantizedDepthwiseConv2D, QuantizedLogistic, RasterAndInterpolate, QuantizedMaxPool, Texture, RasterDiff, QuantizedReshape, QuantizedSoftmax, QuantizeMaxMin, QuantizeV2, Range, Rank, ReduceJoin, Reduction, ReLU, ReLU6, // Use as Clip RequantizationRange, Requantize, Reshape, Resize, RNN, ROIPooling, Scale, Selu, Seq2Out, Shape, Sigmoid, Size, Slice, SliceTf, Softmax, SpaceToBatchND, SpatialProduct, Col2Im, Segment, Squeeze, StridedSlice, CastLike, StringSplit, StringToNumber, TanH, TfQuantizedConv2D, Threshold, Tile, TopKV2, Transpose, UnaryOp, Unpack, Where, Moments, RNNSequenceGRU, BatchMatMul, Unsqueeze, CosineSimilarity, DepthToSpace, SpaceToDepth, ReverseSequence, Pooling3D, Convolution3D, MatrixBandPart, GatherND, DetectionPostProcess, UnravelIndex, ScatterNd, OneHot, BroadcastTo, Dilation2D, Interp3D, Raster = 128, ConvertTensor = 129, ArgMin = 130, LinSpace = 131, RandomUniform = 132, // TensorArray Ops TensorArray = 133, TensorArraySize = 134, TensorArrayRead = 135, TensorArrayWrite = 136, TensorArrayGather = 137, TensorArrayScatter = 138, TensorArraySplit = 139, TensorArrayConcat = 140, LSTMBlockCell = 141, Reverse = 142, ROIAlign = 143, RandomNormal = 144, TensorArrayInsert = 145, TensorArrayErase = 146, EyeLike = 147, CumSum = 148, Det = 149, CumProd = 150, ScatterElements = 151, GatherElements = 152, Svd = 153, Histogram = 154, DynamicQuant = 155, Stft = 156, Plugin = 256, //The Type load from plugin //Training Op Start from 257 Select = 257, ZerosLike, Broastcast, SetDiff1D, ReluGrad, Identity, PoolGrad, SoftmaxGrad, Conv2DBackPropFilter, TrainableParam, BatchNorm, ConvTranspose3D, // Use for self defined grad ZeroGrad, // User define op Attention = 299, FmhaV2 = 300, Fmhca = 301, SeqLen2Spatial = 302, SplitGeLU = 303, GroupNorm = 304, LinearAttention = 305, RoPE = 306, Extra = 512, // quantization ConvInt8 = 513, Int8ToFloat = 514, DepthwiseConvInt8 = 515, FloatToInt8 = 517, EltwiseInt8 = 518, While = 600, If = 601, LayerNorm = 603, GridSample = 604, } table Plugin { type: string; attr: [Attribute]; } table Extra { type: string; engine: string; info: [byte]; attr:[Attribute]; // The Extra Op can be vectorized for execution vector: bool; } table StringVec { data: [string]; } table AttentionParam { kv_cache: bool = true; kv_shared_layer: string; layer_index: int = -1; kv_shared_layer_index: int = -1; mhq_quant:[TensorQuantInfo]; // qk_scale_q, qk_scale_k, sv_scale_s, sv_scale_v output_c4:bool = false; attnScale: float = 0.0; } table LinearAttentionParam { attn_type: string; num_k_heads: int; num_v_heads: int; head_k_dim: int; head_v_dim: int; use_qk_l2norm: bool; } table RoPEParam { rope_cut_head_dim: int = 0; num_head: int = 0; kv_num_head: int = 0; head_dim: int = 0; q_norm: LayerNorm; k_norm: LayerNorm; } table FmhaV2Param { heads: int; } table FmhcaParam { heads: int; } table StftParam { n_fft: int; hop_length: int; abs: bool = true; } table ShapeParam { hasStart: bool = false; start: int = 0; hasEnd: bool = false; end: int = 0; } table WhileParam { // The name of condition subgraph. cond_graph: string; // The name of body subgraph. body_graph: string; // Aliases the forigen inputs and subgraph inputs. // One forign input maybe correspond to multiple subgraph inputs. aliases_inputs: [StringVec]; // Aliases the forigen outputs and subgraph outputs. aliases_outputs: [string]; // Aliases body subgraph outputs and inputs. // One input should be updated by only one output. aliases_updates: [StringVec]; } table IfParam { // The name of then subgraph. then_graph: string; // The name of else subgraph. else_graph: string; // Aliases the forigen inputs and subgraph inputs. // One forign input maybe correspond to multiple subgraph inputs. aliases_inputs: [StringVec]; // Aliases the forigen outputs and subgraph outputs. // Each output should has two possible value from then branch and // else branch. aliases_outputs: [StringVec]; } table RegionCommand { op: Op; steps:[int]; size:[int]; indexes:[int]; view:[View]; // How to treat output's old value for the region position // If fuse < 0, it means out_new = compute // -3 means output outside region should be set as zero // For backend memory layout is not linear: // -2 means output is totally invalid, we can rewrite output outside region // -1 means the output has valid value outside compute region, we can only rewrite the value in region // If fuse >= 0, use as a BinaryOpOperation op // For example, BinaryOpOperation_DIV means: out_new = out_old / compute fuse: int = -1; // If iterIndex == -1, use 0 -> loopNumber - 1 // If iterIndex >= 0, for i in (inputTensor[loopIndexes]) iterIndexes:[int]; } table LoopParam { tensorNumber:int; outputIndexes:[int]; inputIndexes:[int]; extraTensorInfos:[TensorDescribe]; // The loop can be parallel executed parallel:bool = true; // The number of loop (for i = 0; i