2849 const std::string descriptorName{
"QLstmQueueDescriptor"};
2852 ValidateNumInputs(workloadInfo, descriptorName, 3);
2853 ValidateNumOutputs(workloadInfo, descriptorName, 3);
2865 std::vector<DataType> inputOutputSupportedTypes =
2870 std::vector<DataType> cellStateSupportedTypes =
2875 std::vector<DataType> weightsSupportedTypes =
2880 std::vector<DataType> layerNormPeepholeWeightsSupportedTypes =
2885 std::vector<DataType> biasSupportedTypes =
2891 ValidateDataTypes(inputInfo, inputOutputSupportedTypes, descriptorName);
2892 ValidateDataTypes(outputStateInInfo, inputOutputSupportedTypes, descriptorName);
2893 ValidateDataTypes(cellStateInInfo, cellStateSupportedTypes, descriptorName);
2895 ValidateDataTypes(outputStateOutInfo, inputOutputSupportedTypes, descriptorName);
2896 ValidateDataTypes(cellStateOutInfo, cellStateSupportedTypes, descriptorName);
2897 ValidateDataTypes(outputInfo, inputOutputSupportedTypes, descriptorName);
2900 ValidateTensorDataTypesMatch(inputInfo, outputStateInInfo, descriptorName,
"input",
"outputStateIn");
2901 ValidateTensorDataTypesMatch(outputStateInInfo, outputStateOutInfo, descriptorName,
2902 "outputStateIn",
"outputStateOut");
2903 ValidateTensorDataTypesMatch(cellStateInInfo, cellStateOutInfo, descriptorName,
"cellStateIn",
"cellStateOut");
2906 const uint32_t numBatches = inputInfo.GetShape()[0];
2907 const uint32_t inputSize = inputInfo.GetShape()[1];
2908 const uint32_t outputSize = outputStateInInfo.GetShape()[1];
2909 const uint32_t numUnits = cellStateInInfo.GetShape()[1];
2912 ValidateTensorNumDimNumElem(inputInfo, 2, (numBatches * inputSize), descriptorName +
" input");
2913 ValidateTensorNumDimNumElem(outputStateInInfo, 2, (numBatches * outputSize), descriptorName +
" outputStateIn");
2914 ValidateTensorNumDimNumElem(cellStateInInfo, 2, (numBatches * numUnits), descriptorName +
" cellStateIn");
2916 ValidateTensorNumDimNumElem(outputStateOutInfo, 2, (numBatches * outputSize), descriptorName +
" outputStateOut");
2917 ValidateTensorNumDimNumElem(cellStateOutInfo, 2, (numBatches * numUnits), descriptorName +
" cellStateOut");
2918 ValidateTensorNumDimNumElem(outputInfo, 2, (numBatches * outputSize), descriptorName +
" output");
2923 ValidateTensorNumDimNumElem(inputToForgetWeightsInfo, 2, (numUnits * inputSize),
" InputToForgetWeights");
2927 ValidateTensorNumDimNumElem(inputToCellWeightsInfo, 2, (numUnits * inputSize),
" InputToCellWeights");
2931 ValidateTensorNumDimNumElem(inputToOutputWeightsInfo, 2, (numUnits * inputSize),
" InputToOutputWeights");
2935 ValidateTensorNumDimNumElem(recurrentToForgetWeightsInfo, 2, (numUnits * outputSize),
2936 " RecurrentToForgetWeights");
2940 ValidateTensorNumDimNumElem(recurrentToCellWeightsInfo, 2, (numUnits * outputSize),
" RecurrentToCellWeights");
2944 ValidateTensorNumDimNumElem(recurrentToOutputWeightsInfo, 2, (numUnits * outputSize),
" RecurrentToCellWeights");
2947 ValidateDataTypes(inputToForgetWeightsInfo, weightsSupportedTypes, descriptorName);
2949 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToCellWeightsInfo, descriptorName,
2950 "inputToForgetWeights",
"inputToCellWeights");
2951 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToOutputWeightsInfo, descriptorName,
2952 "inputToForgetWeights",
"inputToOutputWeights");
2954 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToForgetWeightsInfo, descriptorName,
2955 "inputToForgetWeights",
"recurrentToForgeteights");
2956 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToCellWeightsInfo, descriptorName,
2957 "inputToForgetWeights",
"recurrentToCellWeights");
2958 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToOutputWeightsInfo, descriptorName,
2959 "inputToForgetWeights",
"recurrentToOutputWeights");
2964 ValidateTensorNumDimNumElem(forgetGateBiasInfo, 1, numUnits,
" ForgetGateBias");
2966 ValidatePointer(
m_CellBias, descriptorName,
"CellBias");
2968 ValidateTensorNumDimNumElem(cellBiasInfo, 1, numUnits,
" CellBias");
2972 ValidateTensorNumDimNumElem(outputGateBiasInfo, 1, numUnits,
" OutputGateBias");
2975 ValidateDataTypes(forgetGateBiasInfo, biasSupportedTypes, descriptorName);
2977 ValidateTensorDataTypesMatch(forgetGateBiasInfo, cellBiasInfo, descriptorName,
2978 "forgetGateBias",
"cellBias");
2979 ValidateTensorDataTypesMatch(forgetGateBiasInfo, outputGateBiasInfo, descriptorName,
2980 "forgetGateBias",
"outputGateBias");
2988 if (!allCifgParamsPresentOrNot)
2991 ": InputToInputWeights, RecurrentToInputWeights and InputGateBias must either all be present " 2992 "(CIFG disabled) or not be present at all (CIFG enabled). m_Parameters.m_CifgEnabled should be " 2993 "set appropriately.");
3000 ValidateTensorNumDimNumElem(inputToInputWeightsInfo, 2, (numUnits * inputSize),
" InputToInputWeights");
3003 ValidateTensorNumDimNumElem(recurrentToInputWeightsInfo, 2, (numUnits * outputSize),
3004 " RecurrentToInputWeights");
3007 ValidateTensorNumDimNumElem(inputGateBiasInfo, 1, numUnits,
" InputGateBias");
3010 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToInputWeightsInfo, descriptorName,
3011 "inputToForgetWeights",
"inputToInputWeights");
3012 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToInputWeightsInfo, descriptorName,
3013 "inputToForgetWeights",
"recurrentToInputWeights");
3014 ValidateTensorDataTypesMatch(forgetGateBiasInfo, inputGateBiasInfo, descriptorName,
3015 "forgetGateBias",
"inputGateBias");
3019 bool allPeepholeWeightsPresentOrNot =
3025 if (!allPeepholeWeightsPresentOrNot)
3028 ": CellToInputWeights, CellToForgetWeights and CellToOutputWeights should all be present (Peephole " 3029 "enabled) or not be present at all (Peephole disabled). CellToInputWeights should only be present " 3030 "when Peephole is enabled and CIFG is disabled. m_Parameters.m_PeepholeEnabled should be set " 3037 ValidateTensorNumDimNumElem(cellToForgetWeightsInfo, 1, numUnits,
" cellToForgetWeights");
3038 ValidateDataTypes(cellToForgetWeightsInfo, layerNormPeepholeWeightsSupportedTypes, descriptorName);
3041 ValidateTensorNumDimNumElem(cellToOutputWeightsInfo, 1, numUnits,
" cellToOutputWeights");
3042 ValidateTensorDataTypesMatch(cellToForgetWeightsInfo, cellToOutputWeightsInfo, descriptorName,
3043 "cellToForgetWeight",
"cellToOutputWeights");
3048 ValidateTensorNumDimNumElem(cellToInputWeightsInfo, 1, numUnits,
" cellToInputWeights");
3049 ValidateTensorDataTypesMatch(cellToForgetWeightsInfo, cellToInputWeightsInfo, descriptorName,
3050 "cellToForgetWeights",
"cellToInputWeights");
3055 bool allLayerNormWeightsPresentOrNot =
3061 if (!allLayerNormWeightsPresentOrNot)
3064 ": InputLayerNormWeights, ForgetLayerNormWeights, m_OutputLayerNormWeights " 3065 "and CellLayerNormWeights should all be present (Layer Norm enabled) or not " 3066 "be present at all (Layer Norm disabled). InputLayerNormWeights should " 3067 "only be present when Layer Norm is enabled and CIFG is disabled. " 3068 "m_Parameters.m_LayerNormEnabled should be set appropriately.");
3074 ValidateTensorNumDimNumElem(forgetLayerNormWeightsInfo, 1, numUnits,
" forgetLayerNormWeights");
3075 ValidateDataTypes(forgetLayerNormWeightsInfo, layerNormPeepholeWeightsSupportedTypes, descriptorName);
3078 ValidateTensorNumDimNumElem(cellLayerNormWeightsInfo, 1, numUnits,
" cellLayerNormWeights");
3079 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, cellLayerNormWeightsInfo, descriptorName,
3080 "forgetLayerNormWeights",
"cellLayerNormWeights");
3083 ValidateTensorNumDimNumElem(outputLayerNormWeightsInfo, 1, numUnits,
" outputLayerNormWeights");
3084 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, outputLayerNormWeightsInfo, descriptorName,
3085 "forgetLayerNormWeights",
"outputLayerNormWeights");
3090 ValidateTensorNumDimNumElem(inputLayerNormWeightsInfo, 1, numUnits,
" inputLayerNormWeights");
3091 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, inputLayerNormWeightsInfo, descriptorName,
3092 "forgetLayerNormWeights",
"inputLayerNormWeights");
3097 bool correctProjectionTensorsPresent =
3102 if (!correctProjectionTensorsPresent)
3105 ": If projection is enabled, ProjectionWeights should be present and " 3106 "ProjectionBias is optional. If projection is disabled, neither " 3107 "ProjectionWeights nor ProjectionBias should be present.");
3113 ValidateTensorNumDimNumElem(projectionWeightsInfo, 2, (numUnits * outputSize),
"ProjectionWeights");
3114 ValidateDataTypes(projectionWeightsInfo, weightsSupportedTypes, descriptorName);
3119 ValidateTensorNumDimNumElem(projectionBiasInfo, 1, outputSize,
"ProjectionBias");
3120 ValidateDataTypes(projectionBiasInfo, biasSupportedTypes, descriptorName);
3127 ": If projection is disabled, output quantization info (scale, offset) " 3128 "should match HiddenStateScale and HiddenStateZeroPoint.");
const ConstCpuTensorHandle * m_CellToForgetWeights
const ConstCpuTensorHandle * m_ProjectionWeights
bool m_PeepholeEnabled
Enable/disable peephole.
const ConstCpuTensorHandle * m_ProjectionBias
float m_HiddenStateScale
Hidden State quantization scale.
const ConstCpuTensorHandle * m_ForgetLayerNormWeights
const ConstCpuTensorHandle * m_CellLayerNormWeights
const ConstCpuTensorHandle * m_RecurrentToCellWeights
const ConstCpuTensorHandle * m_RecurrentToInputWeights
const ConstCpuTensorHandle * m_OutputGateBias
const ConstCpuTensorHandle * m_CellBias
QLstmDescriptor m_Parameters
const ConstCpuTensorHandle * m_CellToOutputWeights
const ConstCpuTensorHandle * m_OutputLayerNormWeights
std::vector< TensorInfo > m_InputTensorInfos
bool m_LayerNormEnabled
Enable/disable layer normalization.
const ConstCpuTensorHandle * m_InputToForgetWeights
std::vector< TensorInfo > m_OutputTensorInfos
const ConstCpuTensorHandle * m_CellToInputWeights
const ConstCpuTensorHandle * m_RecurrentToOutputWeights
bool m_ProjectionEnabled
Enable/disable the projection layer.
const ConstCpuTensorHandle * m_InputGateBias
const ConstCpuTensorHandle * m_InputLayerNormWeights
const ConstCpuTensorHandle * m_RecurrentToForgetWeights
const ConstCpuTensorHandle * m_ForgetGateBias
const ConstCpuTensorHandle * m_InputToOutputWeights
bool m_CifgEnabled
Enable/disable CIFG (coupled input & forget gate).
const TensorInfo & GetTensorInfo() const
const ConstCpuTensorHandle * m_InputToInputWeights
int32_t m_HiddenStateZeroPoint
Hidden State zero point.
const ConstCpuTensorHandle * m_InputToCellWeights