-chlo-legalize-to-stablehlo

CHLO 작업 흐름에서 StableHLO 및 Shape 작업으로 정규화

-shape-legalize-to-stablehlo

도형 관련 연산을 StableHLO로 합법화합니다.

도형 관련 연산을 StableHLO 연산으로 합법화하는 실험용 패스입니다.

선택적 패스를 통해 도형과 데이터 계산을 함께 가져오면 StableHLO 생태계에서 StableHLO 연산을 사용하여 동적 모델링을 하는 컴파일 파이프라인을 활용할 수 있습니다.

-stablehlo-aggressive-folder

StableHLO 작업 접힘

옵션

-fold-float : Allow for potentially lossy computations using float type.

-stablehlo-aggressive-simplification

StableHLO 작업을 정규화합니다.

-stablehlo-canonicalize-dynamism

동적 StableHLO 연산을 정적 연산으로 정규화합니다.

이러한 작업의 모든 동적 요소가 실제로 상수인 경우 DynamicReshapeOp과 같은 동적 StableHLO 작업을 상응하는 정적 작업(예: DynamicReshapeOpReshapeOp 또는 DynamicBroadcastInDimBroadcastInDim)으로 대체합니다.

  %c = stablehlo.constant dense<16> : tensor<1xi32>
  %0 = stablehlo.dynamic_broadcast_in_dim %cst, %c, dims = [] : (tensor<f32>, tensor<1xi32>) -> tensor<16xf32>

  ==>

  %0 = stablehlo.broadcast_in_dim %cst, dims = [] : (tensor<f32>) -> tensor<16xf32>

-stablehlo-compatibility-expander

StableHLO 연산을 위한 호환성 확장 프로그램

StableHLO 연산이 업데이트되거나 최신 버전에서 새 연산이 도입됩니다. 이 선택적 패스는 최신 StableHLO 작업을 이전 버전에서 지원하는 등가 작업으로 분해하여 이전 StableHLO 버전과의 하위 호환성을 확장합니다.

이 패스는 선택사항인 이유는 무엇인가요?

때때로 StableHLO 연산자 개선사항은 OpenXLA 생태계에서 특정 일반적인 패턴의 처리를 크게 단순화하는 데 사용됩니다. 여기에는 프레임워크 및 컴파일러 지원이 뛰어난 TanOp와 슬라이스를 사용하여 표현할 수 있지만 샤딩을 훨씬 더 어렵게 만드는 수집/분산 배치 측정기준이 포함됩니다. 이 카테고리의 새 기능은 후속 최적화에 사용되는 중요한 정보를 삭제할 수 있으므로 자동 다운그레이드가 제공되지 않습니다. 이 패스는 타겟 버전을 기반으로 이러한 작업을 확장하여 최적화되지 않은 컴파일을 희생시키면서 호환성을 극대화하는 데 사용할 수 있습니다.

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %1 = stablehlo.tan %arg0 : tensor<4xf64>
  func.return %1 : tensor<4xf64>
}

==>

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %0 = stablehlo.sine %arg0 : tensor<4xf64>
  %1 = stablehlo.cosine %arg0 : tensor<4xf64>
  %2 = stablehlo.divide %0, %1 : tensor<4xf64>
  return %2 : tensor<4xf64>
}

옵션

-target : The target version. Must be a version of the form #.#.#.

-stablehlo-convert-to-signless

부호 없는 정수가 되도록 IR을 변환하는 패스입니다.

-stablehlo-legalize-composite-to-call

합성 연산을 분해 호출로 대체합니다.

복합 연산을 분해 호출로 바꿉니다(예: 아래).

stablehlo.composite "my_namespace.my_op" %arg0, %arg1 {
  decomposition = @bar,
  version = 1,
  composite_attributes = {
    "my_attribute": "my_value"
  }
}

다음과 같이 변환됩니다.

func.call @bar(%arg0, %arg1)

'except' 플래그를 사용하여 합성물의 하위 집합을 이 변환에서 제외할 수 있습니다.예를 들면 다음과 같습니다.

stablehlo-opt --stablehlo-legalize-composite-to-call=except='foo.baz,foo.qux'

옵션

-except : Names of composites that should not be replaced with calls.

-stablehlo-legalize-deprecated-ops

지원 중단된 작업을 잘 지원되는 작업으로 합법화합니다.

StableHLO v1.0 Opset 지원 중단 RFC (#2283)에서는 여러 중복 연산을 삭제할 것을 제안합니다. 이 패스는 이러한 연산 삭제를 장기적으로 지원되는 대응 항목으로 합법화하여 다양한 컴파일 파이프라인에서 이러한 연산 삭제의 영향을 평가하는 데 도움이 됩니다.

옵션

-fail-on-unused : Fail on (mostly) unused ops that are deprecated without any fallback.

-stablehlo-legalize-qdq-to-quantized-op

패턴을 (정규화 해제, 부동 소수점 연산, 정규화) StableHLO 정규화 연산으로 융합

패턴을 StableHLO 양자화된 작업으로 융합 (양자화 해제, 부동 소수점 연산, 양자화)합니다. 참고: 이 패스는 기존의 op를 삭제하지 않습니다. 예를 들어 다음 프로그램

func.func @add(%arg0: tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
  func.return %2 : tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
}

다음과 같이 변환됩니다.

func.func @add(%arg0: tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.abs %arg0 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  %3 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  return %2 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
}

-stablehlo-legalize-quant-to-math

StableHLO 정규화된 연산을 StableHLO 원시 수학 연산으로 변환합니다.

UniformQuantized 유형을 사용하는 StableHLO 프로그램을 의미상 동등한 정수 수학 연산으로 변환합니다.

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

다음과 같이 변환됩니다.

func.func @add(%arg0: tensor<i8>, %arg1: tensor<i8>) -> tensor<i8> {
  %0 = stablehlo.convert %arg0 : (tensor<i8>) -> tensor<f32>
  %cst = stablehlo.constant dense<0.333333343> : tensor<f32>
  %1 = chlo.broadcast_multiply %0, %cst : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_0 = stablehlo.constant dense<2.000000e+00> : tensor<f32>
  %2 = chlo.broadcast_add %1, %cst_0 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %3 = stablehlo.round_nearest_even %2 : tensor<f32>
  %4 = stablehlo.convert %3 : (tensor<f32>) -> tensor<i32>
  %5 = stablehlo.convert %arg1 : (tensor<i8>) -> tensor<f32>
  %cst_1 = stablehlo.constant dense<0.666666686> : tensor<f32>
  %6 = chlo.broadcast_multiply %5, %cst_1 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_2 = stablehlo.constant dense<1.33333337> : tensor<f32>
  %7 = chlo.broadcast_add %6, %cst_2 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %8 = stablehlo.round_nearest_even %7 : tensor<f32>
  %9 = stablehlo.convert %8 : (tensor<f32>) -> tensor<i32>
  %c = stablehlo.constant dense<2> : tensor<i32>
  %10 = chlo.broadcast_add %4, %9 : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %11 = chlo.broadcast_subtract %10, %c : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %c_3 = stablehlo.constant dense<-128> : tensor<i32>
  %c_4 = stablehlo.constant dense<127> : tensor<i32>
  %12 = stablehlo.clamp %c_3, %11, %c_4 : tensor<i32>
  %13 = stablehlo.convert %12 : (tensor<i32>) -> tensor<i8>
  return %13 : tensor<i8>
}

-stablehlo-legalize-quantized-op-to-qdq

정규화된 StableHLO 연산을 (정규화 해제, 부동 소수점 연산, 정규화) 패턴으로 분해합니다.

균일한 양자화/역양자화 작업을 사용하여 양자화된 StableHLO 프로그램을 분해합니다. 예를 들어 다음 프로그램

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

다음과 같이 변환됩니다.

func.func @add(%arg0: tensor<!quant.uniform<i8:f32, 1.000000e+00>>, %arg1: tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<!quant.uniform<i8:f32, 1.000000e+00>>) -> tensor<f32>
  %1 = stablehlo.uniform_dequantize %arg1 : (tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<f32>
  %2 = stablehlo.add %0, %1 : tensor<f32>
  %3 = stablehlo.uniform_quantize %2 : (tensor<f32>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
  return %3 : tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
}

-stablehlo-legalize-to-vhlo

StableHLO를 VHLO로 합법화합니다.

-stablehlo-refine-arguments

기본 함수의 인수 도형을 미세 조정합니다.

입력 유형 서명을 사용하여 기본 함수의 인수를 수정합니다. 도형 미세 조정이 실행되기 전에 IR을 유효하게 유지하기 위해 인수를 custom_call @stablehlo.shape_refinement_operand_wrapper로 래핑합니다.

func.func public @main(%arg0: tensor<?xf32>) -> tensor<?xf32> {
  ...
}

==>

func.func public @main(%arg0: tensor<16xf32>) -> tensor<?xf32> {
  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
    : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  ...

refinedTypesOption는 세분화된 유형 목록을 지정하는 데 사용할 수 있습니다. 이는 MLIR에서 --types='tensor<...>,tensor<...>'로 지정하거나 패스 생성 메서드에 전달할 수 있습니다. 세분화 유형 목록은 세분화되는 main 메서드의 모든 인수 유형을 지정해야 합니다.

옵션

-types : The new types to be used for the main function's arguments, specified as an MLIR TypeRange 'tensor<1x2xf32>, ...'

-stablehlo-refine-shapes

StableHLO 프로그램 전반에서 도형을 미세 조정합니다.

연산 내에서 도형을 미세 조정하는 StableHLO 프로그램을 살펴봅니다.

이 패스의 대표적인 사용 사례는 동적으로 형식이 지정된 프로그램을 정적 도형으로 특성화하는 것입니다. 동적 형식의 StableHLO 프로그램에 올바른 구조가 있는 경우 인수 유형을 동적 형식에서 정적 형식으로 업데이트하고 이 패스를 실행하면 프로그램 전체에 정적 형식이 전파됩니다.

이 패스는 결과 사용을 피연산자로 직접 대체하여 custom_call @shape_refinement_operand_wrapper를 삭제하고 프로그램 전체에 정적 도형을 전파합니다.

  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
      : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  %1 = stablehlo.add %0, %0 : tensor<?xf32>

  ==>

  %1 = stablehlo.add %arg0, %arg0 : tensor<16xf32>

도형 세분화에 유효한 모듈에는 다음과 같은 속성이 있어야 합니다.

  • 모든 동적 도형은 입력 도형에만 종속됩니다 (입력 배열 콘텐츠에 대한 도형 종속 항목 없음). 입력 도형 (예: stablehlo.get_dimension_size에 의해 제공됨) 또는 기호 정수의 확인된 값과 같은 전역 상수 (예: 텐서 : A = 5)에만 전이적으로 종속되는 연산을 dimension 연산이라고 합니다. 모든 측정기준 값은 프로시저 간 상수 접힘을 통해 상수로 확인될 수 있습니다.
  • 중간 함수는 인수 목록의 시작 부분에 여러 개의 토큰 인수 (유형: !stablehlo.token)를 취할 수 있으며, 그 뒤에는 상징적 정수의 확인된 값 (예: 텐서 : A = 5)과 같이 정수 스칼라인 일부 전역 상수 인수가 올 수 있습니다.
  • 일부 중간 함수는 전역 상수에 대한 계산(예: symint 값에 대한 floordiv)을 반환할 수 있습니다. 이러한 함수는 미세 조정 후 상수 값만 반환하여 표시됩니다. 이러한 함수는 인라인 처리됩니다.
  • 단일 함수에 대한 모든 호출은 동일한 인수 모양으로 확인되며 재귀 / 공동 재귀 함수 호출은 실행되지 않습니다. ### -vhlo-legalize-to-stablehlo

VHLO를 StableHLO로 합법화합니다.

-vhlo-to-version

VHLO 버전 간에 변환합니다.

옵션

-target : The target version. Must be a version of the form #.#.# .