LiteRT 및 TensorFlow 연산자 호환성

모델에서 사용하는 머신러닝 (ML) 연산자는 TensorFlow 모델을 LiteRT 형식으로 변환하는 프로세스에 영향을 줄 수 있습니다. LiteRT 변환기는 일반적인 추론 모델에 사용되는 제한된 수의 TensorFlow 작업을 지원하므로 모든 모델을 직접 변환할 수 있는 것은 아닙니다. 변환기 도구를 사용하면 연산자를 추가할 수 있지만 이 방식으로 모델을 변환하려면 모델을 실행하는 데 사용하는 LiteRT 런타임 환경도 수정해야 하므로 Google Play 서비스와 같은 표준 런타임 배포 옵션을 사용하는 기능이 제한될 수 있습니다.

LiteRT 변환기는 모델 구조를 분석하고 직접 지원되는 연산자와 호환되도록 최적화를 적용하도록 설계되었습니다. 예를 들어 모델의 ML 연산자에 따라 변환기는 LiteRT 대응 항목에 매핑하기 위해 이러한 연산자를 생략하거나 융합할 수 있습니다.

지원되는 작업의 경우에도 성능상의 이유로 특정 사용 패턴이 예상되는 경우가 있습니다. LiteRT와 함께 사용할 수 있는 TensorFlow 모델을 빌드하는 방법을 이해하는 가장 좋은 방법은 이 프로세스에서 부과하는 제한사항과 함께 작업이 변환되고 최적화되는 방식을 신중하게 고려하는 것입니다.

지원되는 연산자

LiteRT 내장 연산자는 TensorFlow 핵심 라이브러리에 포함된 연산자의 하위 집합입니다. TensorFlow 모델에는 복합 연산자 또는 사용자가 정의한 새 연산자 형태의 맞춤 연산자가 포함될 수도 있습니다. 아래 다이어그램은 이러한 연산자 간의 관계를 보여줍니다.

TensorFlow 연산자

이 ML 모델 연산자 범위에서 변환 프로세스에서 지원하는 모델에는 3가지 유형이 있습니다.

  1. LiteRT 내장 연산자만 있는 모델 (권장)
  2. 기본 제공 연산자와 선택한 TensorFlow 핵심 연산자가 있는 모델
  3. 기본 제공 연산자, TensorFlow 핵심 연산자 또는 맞춤 연산자가 있는 모델

모델에 LiteRT에서 기본적으로 지원하는 작업만 포함된 경우 변환을 위한 추가 플래그가 필요하지 않습니다. 이 유형의 모델은 원활하게 변환되며 기본 LiteRT 런타임을 사용하여 최적화하고 실행하기가 더 간단하므로 이 경로를 사용하는 것이 좋습니다. Google Play 서비스와 같은 모델 배포 옵션도 더 많습니다. LiteRT 변환기 가이드를 시작하면 됩니다. 내장 연산자 목록은 LiteRT 작업 페이지를 참고하세요.

핵심 라이브러리에서 선택한 TensorFlow 작업을 포함해야 하는 경우 변환 시 이를 지정하고 런타임에 해당 작업이 포함되어 있는지 확인해야 합니다. 자세한 단계는 TensorFlow 연산자 선택 주제를 참고하세요.

가능하면 변환된 모델에 맞춤 연산자를 포함하는 마지막 옵션은 피하세요. 맞춤 연산자는 여러 기본 TensorFlow 핵심 연산자를 결합하여 만들거나 완전히 새로운 연산자를 정의하여 만든 연산자입니다. 맞춤 연산자가 변환되면 내장 LiteRT 라이브러리 외부의 종속 항목이 발생하여 전체 모델의 크기가 커질 수 있습니다. 모바일 또는 기기 배포를 위해 특별히 생성되지 않은 맞춤 작업은 리소스가 제한된 기기에 배포할 때 서버 환경에 비해 성능이 저하될 수 있습니다. 마지막으로, 일부 TensorFlow 핵심 연산자를 포함하는 것과 마찬가지로 맞춤 연산자를 사용하려면 모델 런타임 환경을 수정해야 하므로 Google Play 서비스와 같은 표준 런타임 서비스를 활용할 수 없습니다.

지원되는 유형

대부분의 LiteRT 작업은 부동 소수점 (float32) 및 양자화(uint8, int8) 추론을 모두 타겟팅하지만 많은 작업은 아직 tf.float16 및 문자열과 같은 다른 유형을 타겟팅하지 않습니다.

작업의 다른 버전을 사용하는 것 외에 부동 소수점 모델과 양자화 모델의 또 다른 차이점은 변환 방식입니다. 양자화된 변환에는 텐서의 동적 범위 정보가 필요합니다. 이를 위해서는 모델 학습 중에 '가짜 양자화'를 수행하거나, 보정 데이터 세트를 통해 범위 정보를 가져오거나, '즉석' 범위 추정을 실행해야 합니다. 자세한 내용은 양자화를 참고하세요.

간단한 변환, 상수 폴딩 및 융합

직접적인 상응 항목이 없더라도 LiteRT에서 처리할 수 있는 TensorFlow 작업이 있습니다. 그래프에서 간단히 삭제하거나 (tf.identity) 텐서로 대체하거나 (tf.placeholder) 더 복잡한 작업으로 융합할 수 있는 작업의 경우에 해당합니다 (tf.nn.bias_add). 지원되는 일부 작업도 이러한 프로세스 중 하나를 통해 삭제될 수 있습니다.

다음은 그래프에서 일반적으로 삭제되는 TensorFlow 작업의 일부 목록입니다.

  • tf.add
  • tf.debugging.check_numerics
  • tf.constant
  • tf.div
  • tf.divide
  • tf.fake_quant_with_min_max_args
  • tf.fake_quant_with_min_max_vars
  • tf.identity
  • tf.maximum
  • tf.minimum
  • tf.multiply
  • tf.no_op
  • tf.placeholder
  • tf.placeholder_with_default
  • tf.realdiv
  • tf.reduce_max
  • tf.reduce_min
  • tf.reduce_sum
  • tf.rsqrt
  • tf.shape
  • tf.sqrt
  • tf.square
  • tf.subtract
  • tf.tile
  • tf.nn.batch_norm_with_global_normalization
  • tf.nn.bias_add
  • tf.nn.fused_batch_norm
  • tf.nn.relu
  • tf.nn.relu6

실험적 작업

다음 LiteRT 작업은 있지만 맞춤 모델에 사용할 수 없습니다.

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF