# 지원 프레임워크
qbcompiler는 ONNX, PyTorch, Keras, TensorFlow 및 TensorFlow Lite와 같은 일반적으로 사용되는 머신러닝 프레임워크 및 라이브러리들을 지원합니다.

![지원 프레임워크](../res/image/supported_frameworks_new.png "지원 프레임워크")

# Mobilint IR Operations List
- 다음 목록은 Mobilint 하드웨어에서 네이티브로 지원되는 연산만 포함합니다. 명시적으로 나열되지 않은 연산도 컴파일 과정에서 그래프 수준 변환을 통해 지원 가능 연산으로 변환되는 경우 부분적으로 지원됩니다.
- Mobilint 하드웨어에서 지원되는 모든 연산은 배치 크기 1인 `NHWC`(channel-last) 데이터 포맷을 사용합니다.



| 연산 | 비고 |
| :--- | :--- |
| AddPartial |num inputs: 2<br>num outputs: 1<br>attributes:<br>- is_input0_larger: bool |
| AddingConstant |num inputs: 1<br>num outputs: 1<br>attributes:<br>- constant: Weight<br>- is_const_first: bool (default=false) |
| Adding |num inputs: 2<br>num outputs: 1<br> |
| Batchnorm |num inputs: 1<br>num outputs: 1<br>attributes:<br>- gamma: Weight<br>- beta: Weight<br>- moving_mean: Weight<br>- moving_var: Weight<br>- epsilon: Weight<br>- channel_last: bool (default=true) |
| Celu |num inputs: 1<br>num outputs: 1<br>attributes:<br>- alpha: float32 |
| Clip |num inputs: 1<br>num outputs: 1<br>attributes:<br>- clip_max_value: float32 (optional)<br>- clip_min_value: float32 (optional) |
| Concatenate |num inputs: variable<br>num outputs: 1<br>attributes:<br>- original_key: str (optional)<br>- axis: int32 (optional)<br>- original_axis: int32 (optional)<br>- original_inputs: int32[] (optional)<br>- input_index: int32[] (optional)<br>- input_names: str[] (optional)<br><br>description:<br>input_names: input activation names in original order. input_index: input index in computation order. |
| Convolution |num inputs: 1<br>num outputs: 1<br>attributes:<br>- in_channels: int32<br>- out_channels: int32<br>- h_kernel: int32<br>- w_kernel: int32<br>- h_stride: int32<br>- w_stride: int32<br>- h_dilation: int32<br>- w_dilation: int32<br>- west_padding: int32<br>- east_padding: int32<br>- north_padding: int32<br>- south_padding: int32<br>- padding_list: int32[] (default=[])<br>- group_number: int32<br>- weight: Weight<br>- bias: Weight (optional)<br>- channel_last: bool (default=true) |
| DepthwiseConvolution |num inputs: 1<br>num outputs: 1<br>attributes:<br>- in_channels: int32<br>- out_channels: int32<br>- h_kernel: int32<br>- w_kernel: int32<br>- h_stride: int32<br>- w_stride: int32<br>- h_dilation: int32<br>- w_dilation: int32<br>- west_padding: int32<br>- east_padding: int32<br>- north_padding: int32<br>- south_padding: int32<br>- padding_list: int32[] (default=[])<br>- group_number: int32<br>- weight: Weight<br>- bias: Weight (optional)<br>- channel_last: bool (default=true) |
| DeviceBridge |num inputs: 1<br>num outputs: 1<br>attributes:<br>- squeeze_axes: int32[]<br>- unsqueeze_axes: int32[]<br>- permute_axes: int64[]<br>- device: str (optional) |
| DivConstant |num inputs: 1<br>num outputs: 1<br>attributes:<br>- constant: Weight<br>- is_const_first: bool |
| Div |num inputs: 2<br>num outputs: 1<br> |
| Elu |num inputs: 1<br>num outputs: 1<br>attributes:<br>- leaky_alpha: float32 |
| Erf |num inputs: 1<br>num outputs: 1<br> |
| Exp |num inputs: 1<br>num outputs: 1<br> |
| Gelu |num inputs: 1<br>num outputs: 1<br>attributes:<br>- approximate: bool (default=false) |
| GLU |num inputs: 1<br>num outputs: 1<br> |
| GroupConvolution |num inputs: 1<br>num outputs: 1<br>attributes:<br>- in_channels: int32<br>- out_channels: int32<br>- h_kernel: int32<br>- w_kernel: int32<br>- h_stride: int32<br>- w_stride: int32<br>- h_dilation: int32<br>- w_dilation: int32<br>- west_padding: int32<br>- east_padding: int32<br>- north_padding: int32<br>- south_padding: int32<br>- padding_list: int32[] (default=[])<br>- group_number: int32<br>- weight: Weight<br>- bias: Weight (optional)<br>- channel_last: bool (default=true) |
| GroupNormalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- num_groups: int32<br>- scale: Weight<br>- bias: Weight (optional)<br>- epsilon: Weight<br>- channel_last: bool (default=true) |
| HardSigmoid |num inputs: 1<br>num outputs: 1<br>attributes:<br>- alpha: float32 (optional)<br>- beta: float32 (optional) |
| Hardtanh |num inputs: 1<br>num outputs: 1<br>attributes:<br>- min_val: float32 (default=-1.0)<br>- max_val: float32 (default=1.0) |
| HardSwish |num inputs: 1<br>num outputs: 1<br> |
| HeaderView |num inputs: 1<br>num outputs: 1<br>attributes:<br>- view_shape: int32[] (default=[])<br>- num_heads: int32 (default=-1)<br>- batch_order: int32 (default=0)<br><br>description:<br>HeaderView simplifies the following sequence of operations.<br>If batch_order == 0<br>(n,h,w,c)-[reshape]->(1, h, w, num_heads c/num_heads)<br>-[transpose01324]->(1, h, num_heads, w, c/num_heads)<br>-[reshape]->(1, h*num_heads, w, c/num_heads)<br>If batch_order == 1<br>(n,h,w,c)-[reshape]->(1, h, w, num_heads, c/num_heads)<br>-[transpose03124]->(1, num_heads, h, w, c/num_heads)<br>-[reshape]->(1, num_heads*h, w, c/num_heads) |
| HeaderViewRevert |num inputs: 1<br>num outputs: 1<br>attributes:<br>- revert_shape: int32[] (default=[])<br>- num_heads: int32 (default=-1)<br>- batch_order: int32 (default=0)<br><br>description:<br>HeaderViewRevert simplifies the following sequence of operations.<br>If batch_order == 0<br>(n,h,w,c)-[reshape]->(1, h/num_heads, num_heads, w, c)<br>-[transpose01324]->(1, h/num_heads, w, num_heads, c)<br>-[reshape]->(1, h/num_heads, w, num_heads * c)<br>If batch_order == 1<br>(n,h,w,c)-[reshape]->(1, num_heads, h/num_heads, w, c)<br>-[transpose02314]->(1, h/num_heads, w, num_heads, c)<br>-[reshape]->(1, h/num_heads, w, num_heads*c) |
| Identity |num inputs: 1<br>num outputs: 1<br> |
| InputConstant |num inputs: 0<br>num outputs: 1<br>attributes:<br>- constant: Weight |
| Input |num inputs: 1<br>num outputs: 1<br> |
| InstanceNormalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- scale: Weight<br>- bias: Weight (optional)<br>- epsilon: Weight<br>- channel_last: bool (default=true)<br>- num_groups: int32 (default=-1)<br>- group_order: int32 (default=-1)<br><br>description:<br>If `num_groups` and `order` are specified, the channel dimension is grouped and rearranged before normalization.<br>For example, the following sequence:<br>(n, 1, w, c*2)-[reshape]->(n, w, c, 2)<br>-[transpose0312]->(n, 2, w, c)<br>-[InstanceNorm, num_features=c]->(n, 2, w, c)<br>-[transpose0231]->(n, w, c, 2)<br>-[reshape]->(n, 1, w, c*2)<br>is equivalent to a single operation:<br>(n, 1, w, c*2)-[InstanceNormalization, num_features=c, num_groups=2, group_order=1]->(n, 1, w, c*2)<br>The follosing sequence:<br>(n, 1, w, 2*c)-[reshape]->(n,w,2,c)<br>-[InstanceNorm, num_features=c]->(n, w, 2, c)<br>-[reshape]v(n, 1, w, c*2)<br>is equivalent to a single operation:<br>(n, 1, w, 2*c)-[InstanceNormalization, num_features=c, num_groups=2, group_order=0]->(n, 1, w, 2*c) |
| L1Normalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- norm_axis: int32[] |
| L2Normalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- norm_axis: int32[]<br>- epsilon: Weight (optional) |
| LSTM |num inputs: variable<br>num outputs: 1<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- lstm_group: str<br>- input_mask: str<br>- output_mask: str<br>- P: Weight (optional)<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- hidden_size: int32<br><br>description:<br>inputs:[input, sequence_lens, initial_h, initial_c]<br>outputs:[output] or [hidden_out] or [cell_out]<br>input_mask: "ishc" or "i", etc,...<br>output_mask: "o" or "h" or "c" |
| LayerNormalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- normalized_shape: int64[] (default=[])<br>- scale: Weight<br>- bias: Weight (optional)<br>- epsilon: Weight |
| Logit |num inputs: 1<br>num outputs: 1<br>attributes:<br>- eps: float32 (optional)<br><br>description:<br>Compute y = ln(z / (1 - z)). If eps is given, we clamp input z = clamp(z, min=eps, max=1-eps) |
| RNN |num inputs: variable<br>num outputs: 1<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- rnn_group: str<br>- input_mask: str<br>- output_mask: str<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- hidden_size: int32<br><br>description:<br>inputs:[input, sequence_lens, initial_h]<br>outputs:[output] or [hidden_out]<br>input_mask: "ish" or "i", etc,...<br>output_mask: "o" or "h" |
| GRU |num inputs: variable<br>num outputs: 1<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- gru_group: str<br>- input_mask: str<br>- output_mask: str<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- linear_before_reset: bool (default=false)<br>- hidden_size: int32<br><br>description:<br>inputs:[input, sequence_lens, initial_h]<br>outputs:[output] or [hidden_out]<br>input_mask: "ish" or "i", etc,...<br>output_mask: "o" or "h" |
| LeakyRelu |num inputs: 1<br>num outputs: 1<br>attributes:<br>- leaky_alpha: float32 |
| Log |num inputs: 1<br>num outputs: 1<br> |
| LogSigmoid |num inputs: 1<br>num outputs: 1<br> |
| MatMul |num inputs: variable<br>num outputs: 1<br>attributes:<br>- constant: Weight (optional)<br>- is_const_first: bool (default=false)<br>- repeat: int32[2] (default=[-1, -1])<br><br>description:<br>If repeat=(0, 4), then input0 is repeated 4 times along the h-direction.<br>For example, you can perform a matrix multiplication with input0 of shape (1, 8, 52, 64) and<br>input1 of shape (1, 32, 52, 64) by concatenating input0 4 times, resulting in a input0 shape of (1, 32, 52, 64). |
| Mish |num inputs: 1<br>num outputs: 1<br> |
| MultiplyConstant |num inputs: 1<br>num outputs: 1<br>attributes:<br>- constant: Weight<br>- is_const_first: bool (default=false) |
| Multiply |num inputs: 2<br>num outputs: 1<br> |
| Neg |num inputs: 1<br>num outputs: 1<br> |
| Output |num inputs: 1<br>num outputs: 1<br> |
| Pad |num inputs: 1<br>num outputs: 1<br>attributes:<br>- west_padding: int32 (default=-1)<br>- east_padding: int32 (default=-1)<br>- south_padding: int32 (default=-1)<br>- north_padding: int32 (default=-1)<br>- pad_mode: str<br>- constant: float32 (default=0.0)<br>- padding_list: int32[] (optional)<br><br>description:<br>padding_list format should be [x1_begin, x2_begin, …, x1_end, x2_end,…],<br>where xi_begin is the number of pad values added at the beginning of axis |
| Pooling |num inputs: 1<br>num outputs: 1<br>attributes:<br>- h_kernel: int32<br>- w_kernel: int32<br>- h_stride: int32<br>- w_stride: int32<br>- h_dilation: int32 (default=1)<br>- w_dilation: int32 (default=1)<br>- west_padding: int32<br>- east_padding: int32<br>- north_padding: int32<br>- south_padding: int32<br>- padding_list: int32[] (default=[])<br>- pool_type: str<br>- pad_mode: str<br>- is_ceil_mode: bool (default=false)<br>- is_include_pad: bool (default=false)<br>- channel_last: bool (default=true) |
| GlobalAveragePooling |num inputs: 1<br>num outputs: 1<br>attributes:<br>- channel_last: bool (default=true) |
| Pow |num inputs: 1<br>num outputs: 1<br>attributes:<br>- exponent: float32 |
| QuickGelu |num inputs: 1<br>num outputs: 1<br> |
| ReduceL2 |num inputs: 1<br>num outputs: 1<br>attributes:<br>- keep_dims: bool<br>- reduce_axes: int32[]<br>- noop_with_empty_axes: int32 |
| ReduceMax |num inputs: 1<br>num outputs: 1<br>attributes:<br>- keep_dims: bool<br>- reduce_axes: int32[]<br>- noop_with_empty_axes: int32 |
| ReduceMean |num inputs: 1<br>num outputs: 1<br>attributes:<br>- keep_dims: bool<br>- reduce_axes: int32[]<br>- noop_with_empty_axes: int32 |
| ReduceProd |num inputs: 1<br>num outputs: 1<br>attributes:<br>- keep_dims: bool<br>- reduce_axes: int32[]<br>- noop_with_empty_axes: int32 |
| ReduceSum |num inputs: 1<br>num outputs: 1<br>attributes:<br>- keep_dims: bool<br>- reduce_axes: int32[]<br>- noop_with_empty_axes: int32 |
| Relu |num inputs: 1<br>num outputs: 1<br> |
| Reshape |num inputs: 1<br>num outputs: 1<br>attributes:<br>- new_shape: int32[] (optional)<br>- allowzero: int32 (default=0)<br>- is_const_first: bool (default=false) |
| Resize |num inputs: 1<br>num outputs: 1<br>attributes:<br>- resize_type: str (optional)<br>- resize_mode: str (optional)<br>- nearest_mode: str (optional)<br>- transform_mode: str (optional)<br>- roi: int32[] (optional)<br>- scales: float32[] (optional)<br>- sizes: int32[] (optional)<br>- cubic_coeff_a: float32 (optional)<br>- exclude_outside: int32 (optional)<br>- extrapolation_value: float32 (optional)<br>- antialias: int32 (optional)<br>- axes: int32[] (optional)<br>- keep_aspect_ratio_policy: str (optional) |
| RmsNormalization |num inputs: 1<br>num outputs: 1<br>attributes:<br>- normalized_shape: int64[] (default=[])<br>- epsilon: Weight<br>- scale: Weight |
| Rsqrt |num inputs: 1<br>num outputs: 1<br> |
| Rstd |num inputs: 1<br>num outputs: 1<br>attributes:<br>- reduce_axes: int32[]<br>- epsilon: Weight<br>- num_groups: int32 (default=1)<br><br>description:<br>computes 1/std(x). if gruops > 1, then activation is grouped along channel axis. |
| Sigmoid |num inputs: 1<br>num outputs: 1<br>attributes:<br>- alpha: float32 (default=1.0)<br><br>description:<br>alpha is added to deal with more general case like 1 / (1 + exp(-alpha * x)) |
| Slice |num inputs: 1<br>num outputs: 1<br>attributes:<br>- axis: int32[]<br>- start: int64[]<br>- end: int64[]<br>- step: int64[] (optional) |
| Softmax |num inputs: 1<br>num outputs: 1<br>attributes:<br>- beta: float32 (default=1.0)<br>- axis: int32 |
| Softplus |num inputs: 1<br>num outputs: 1<br> |
| Sqrt |num inputs: 1<br>num outputs: 1<br> |
| StaggeredPadding |num inputs: 1<br>num outputs: 1<br>attributes:<br>- axis: int32 (default=3)<br>- reverse: bool (default=false)<br>- window_size: int32 (default=-1)<br><br>description:<br>StaggeredPadding does the following:<br>[[[[1,1,1],<br>[2,2,2],<br>[3,3,3],<br>[4,4,4]]<br>[5,5,5]]]]<br>=> [[[[1,1,1,0,0,0,0],<br>[0,2,2,2,0,0,0],<br>[0,0,3,3,3,0,0],<br>[0,0,0,4,4,4,0],<br>[0,0,0,0,5,5,5]]]]<br>That is, each original row is shifted to the right so that its non-zero block lies on a “diagonal,” and all other elements are zero-padded.<br>Then slice last dim by (2*window_size + 1). For example, if window_size=1 in the above, 5=2*1+1 elements are sliced.<br>=> [[[[1,1,0,0,0],<br>[2,2,2,0,0],<br>[0,3,3,3,0],<br>[0,0,4,4,4],<br>[0,0,0,5,5]]]]<br>If reverse<br>[[[[1,1,1],<br>[2,2,2],<br>[3,3,3],<br>[4,4,4]]<br>[5,5,5]]]]<br>=> [[[[0,0,0,0,1,1,1],<br>[0,0,0,2,2,2,0],<br>[0,0,3,3,3,0,0],<br>[0,4,4,4,0,0,0],<br>[5,5,5,0,0,0,0]]]] |
| StatefulAttentionMaskWrapper |num inputs: 1<br>num outputs: 1<br>attributes:<br>- past_seqlen: int32 (default=0)<br>- is_sliding: bool (default=false)<br>- sliding_window: int32 (default=1024)<br>- mask_type: str (default="causal_mask")<br><br>description:<br>mask_type: "causal_mask", "padding_mask" |
| StatefulKVCacheWrapper |num inputs: 1<br>num outputs: 1<br>attributes:<br>- cache_name: str<br>- past_seqlen: int32 (default=0)<br>- is_sliding: bool (default=false)<br>- sliding_window: int32 (default=1024)<br>- max_cache_len: int32 (default=8192) |
| StatefulCausalConvCacheWrapper |num inputs: 1<br>num outputs: 1<br>attributes:<br>- cache_name: str<br>- cache_len: int32 (default=0) |
| StatefulLSTMWrapper |num inputs: variable<br>num outputs: 3<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- input_mask: str<br>- output_mask: str<br>- P: Weight (optional)<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- hidden_size: int32<br>- hidden_state_name: str<br>- cell_state_name: str<br>- subgraph: str<br><br>description:<br>When input_mask is `ishc`, then inputs are [input, sequence_lens, initial_h, initial_c],<br>and if input_mask is `ihc`, then inputs are [input, initial_h, initial_c].<br>The output_mask is `h` means that among [output, hidden_out, cell_out], only the hidden_out is being used. |
| StatefulRNNWrapper |num inputs: variable<br>num outputs: 2<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- input_mask: str<br>- output_mask: str<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- hidden_size: int32<br>- hidden_state_name: str<br>- subgraph: str<br><br>description:<br>When input_mask is `ish`, then inputs are [input, sequence_lens, initial_h],<br>and if input_mask is `ih`, then inputs are [input, initial_h].<br>The output_mask is `h` means that among [output, hidden_out], only the hidden_out is being used. |
| StatefulGRUWrapper |num inputs: variable<br>num outputs: 2<br>attributes:<br>- W: Weight<br>- R: Weight<br>- B: Weight (optional)<br>- input_mask: str<br>- output_mask: str<br>- direction: str (default="forward")<br>- batch_first: bool (default=false)<br>- linear_before_reset: bool (default=false)<br>- hidden_size: int32<br>- hidden_state_name: str<br>- subgraph: str<br><br>description:<br>When input_mask is `ish`, then inputs are [input, sequence_lens, initial_h],<br>and if input_mask is `ih`, then inputs are [input, initial_h].<br>The output_mask is `h` means that among [output, hidden_out], only the hidden_out is being used. |
| StatefulRoPEWrapper |num inputs: 3<br>num outputs: 1<br>attributes:<br>- rope_type: int32 (default=0)<br>- seqlen: int32 (default=0)<br>- rotary_emb_dim: int32 (default=2)<br><br>description:<br>StatefulRoPEWrapper<br>inputs: (q_or_k, con, sin)<br>outputs: (q_or_k_embed)<br>rope_type=> 0: llama, 1: cohere2(aya-vision) |
| SubConstant |num inputs: 1<br>num outputs: 1<br>attributes:<br>- constant: Weight<br>- is_const_first: bool |
| Sub |num inputs: 2<br>num outputs: 1<br> |
| Swish |num inputs: 1<br>num outputs: 1<br> |
| Tanh |num inputs: 1<br>num outputs: 1<br> |
| TransposeConvolution |num inputs: 1<br>num outputs: 1<br>attributes:<br>- in_channels: int32<br>- out_channels: int32<br>- h_kernel: int32<br>- w_kernel: int32<br>- h_stride: int32<br>- w_stride: int32<br>- h_dilation: int32<br>- w_dilation: int32<br>- west_padding: int32<br>- east_padding: int32<br>- north_padding: int32<br>- south_padding: int32<br>- padding_list: int32[] (default=[])<br>- og_padding_list: int32[] (default=[])<br>- og_out_padding_list: int32[] (default=[])<br>- group_number: int32<br>- weight: Weight<br>- bias: Weight (optional)<br>- channel_last: bool (default=true) |
| Transpose |num inputs: 1<br>num outputs: 1<br>attributes:<br>- transpose_axes: int64[] |
| Weightedsum |num inputs: 2<br>num outputs: 1<br>attributes:<br>- weight0: Weight<br>- weight1: Weight |
| OrderedPatchify |num inputs: 1<br>num outputs: 1<br>attributes:<br>- h_kernel: int32<br>- w_kernel: int32<br>- order: int32 (default=0)<br><br>description:<br>This operation splits a 4D input tensor into non-overlapping patches and rearranges them into a sequence<br>according to the specified order. Supports row-major (order=0) and column-major (order=1) layouts.<br>If order=0 (row-major), the equivalent is: 256 patches, each 12x12, (h_kernel=w_kernel=12)<br>(1,192,192,64)-[reshape]->(1,16,12,16,12,64)-[transpose 013245]->(1,16,16,12,12,64)-[reshape]->(1,256,144,64)<br>Note that order0 is its own inverse.<br>If order=1 (column-major), the equivalent is: 144 patches, each 16x16, (h_kernel=w_kernel=12)<br>(1,192,192,64)-[reshape]->(1,16,12,16,12,64)-[transpose 024135]->(1,12,12,16,16,64)-[reshape]->(1,144,256,64)<br>if order=2 (reversing order=1), h_kernel=12, w_kernel=16<br>(1,144,256,64)-[reshape]->(1,12,12,16,16,64)-[transpose 031425]->(1,16,12,16,12,64)-[reshape]->(1,192,192,64) |
