개요
LiteRT는 TensorFlow RNN 모델을 LiteRT로 변환하도록 지원합니다. 융합 LSTM 작업을 수행했습니다. 융합된 작업은 시스템의 성능을 극대화하기 위해 존재합니다. 기본 커널 구현을 제공하고 더 높은 수준의 인터페이스를 사용하여 양자화와 같은 복잡한 변환을 정의합니다.
TensorFlow에는 RNN API의 여러 변형이 있기 때문에 2번입니다.
- Keras LSTM과 같은 표준 TensorFlow RNN API에 대한 기본 지원 제공 권장되는 옵션입니다.
- 전환 인프라에 대한 인터페이스 제공 연결하고 변환하기 위한 사용자 정의 RNN 구현 LiteRT입니다. 이 슬라이드에서 볼 수 있듯이 Google 애널리틱스 4를 사용하여 LSTMCellSimple 및 LayerNormalizedLSTMCellSimple RNN 인터페이스
변환기 API
이 기능은 TensorFlow 2.3 출시에 포함되어 있습니다. 또한 tf-nightly pip 또는 head에서
LiteRT로 전환할 때 이 변환 기능을 사용할 수 있습니다. 사용하여 또는 Keras 모델에서 직접 생성할 수 있습니다. 사용 예를 참고하세요.
저장된 모델에서
# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)
# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
Keras 모델에서
# build a Keras model
keras_model = build_keras_lstm(...)
# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()
예
Keras LSTM에서 LiteRT로 Colab LiteRT 인터프리터를 사용하는 엔드 투 엔드 사용법을 보여줍니다.
TensorFlow RNNs API 지원
Keras LSTM 변환 (권장)
Keras LSTM을 LiteRT로 즉시 변환할 수 있도록 지원합니다. 대상 자세한 내용은 Keras LSTM 인터페이스 변환 로직에 여기를 참고하세요.
LiteRT의 LSTM 계약을 2012년 2월 10일과 같은 Keras 작업 정의로 변경합니다.
- 입력 텐서의 차원 0은 배치 크기입니다.
- recurrent_weight 텐서의 차원 0은 출력됩니다.
- weight 및 recurrent_kernel 텐서는 전치됩니다.
- 전치된 가중치, 전치된 recurrent_kernel, 편향 텐서는 다음과 같습니다. 4개의 동일한 크기의 텐서로 분할됩니다. 이는 입력 게이트, 포겟 게이트, 셀, 출력 게이트와 비교됩니다.
Keras LSTM 변이
시간 주요
사용자는 과로 또는 시간 전부를 선택할 수 있습니다. Keras LSTM에 시간 제약을 더함 속성을 정의합니다. 단방향 시퀀스 LSTM의 경우, unidirecional_sequence_lstm의 시간 주요 속성입니다.
BiDirectional LSTM
양방향 LSTM은 두 개의 Keras LSTM 계층(하나는 하나는 앞쪽으로, 하나는 뒤로 가기입니다. 예시를 확인하세요. 여기에서 확인할 수 있습니다. go_backward 속성을 보면 이를 역방향 LSTM으로 인식한 다음 그룹화하고 역방향 LSTM을 함께 사용합니다. 이는 미래의 일입니다 현재 이렇게 하면 LiteRT에서 두 개의 단방향 시퀀스 LSTM 작업이 생성됩니다. 있습니다.
사용자 정의 LSTM 변환 예
LiteRT는 사용자 정의 LSTM을 변환하는 방법도 제공합니다. 있습니다. 여기서는 Lingvo의 LSTM을 사용하여 있습니다. 자세한 내용은 lingvo.LSTMCellSimple 인터페이스 변환 로직이 여기를 참고하세요. Lingvo의 또 다른 LSTM 정의에 대한 예시도 lingvo.LayerNormalizedLSTMCellSimple 인터페이스 변환 로직이 여기를 참고하세요.
LiteRT로 'Bring Your Own TensorFlow RNN 사용'
사용자의 RNN 인터페이스가 지원되는 표준 인터페이스와 다른 경우 몇 가지 옵션이 있습니다.
옵션 1: TensorFlow Python으로 어댑터 코드를 작성하여 RNN 인터페이스 조정 Keras RNN 인터페이스로 이동합니다. 이것은 tf.function을 의미하는데 tf_Implements 주석을 인코더-디코더에 의해 생성된 함수와 동일한 생성된 RNN 인터페이스의 Keras LSTM 레이어. 이후 Keras LSTM에 사용된 것과 동일한 전환 API 작동합니다.
옵션 2: 위의 방법을 사용할 수 없는 경우 (예: Keras LSTM에 일부 현재 LiteRT의 융합 LSTM 작업에 의해 노출되는 레이어 정규화)한 다음, 이를 작성하여 LiteRT 변환기를 맞춤 변환 코드를 생성하고 준비-복합-함수에 연결 MLIR-pass 여기를 참고하세요. 함수의 인터페이스는 API 계약처럼 취급되어야 하며 통합 LiteRT LSTM으로 변환하는 데 필요한 인수 포함 레이어 정규화와 같은 레이어 정규화를 사용합니다. 이 함수에 인수로 전달된 텐서가 순위 (예: MLIR의 RankedTensorType). 이렇게 하면 텐서를 RankedTensorType으로 가정할 수 있고 융합된 LiteRT에 해당하는 순위가 지정된 텐서로 변환 연산자의 피연산자입니다.
이러한 변환 흐름의 전체 예는 Lingvo의 LSTMCellSimple에서 LiteRT 변환입니다.
Lingvo의 LSTMCellSimple은 여기에서 확인할 수 있습니다. 이 LSTM 셀로 학습된 모델은 다음과 같이 LiteRT로 변환할 수 있습니다. 다음과 같습니다.
- tf_implementations를 사용하여 tf.function에서 LSTMCellSimple의 모든 사용 래핑 라벨이 지정된 주석 (예: lingvo.LSTMCellSimple은 적절한 주석 이름) 생성된 tf.function 확인 전환 코드에서 예상되는 함수의 인터페이스와 일치 이 주석을 추가하는 모델 작성자와 전환 코드
준비-복합-함수 전달을 확장하여 맞춤 복합 작업 연결 LiteRT 융합 LSTM 작업 변환으로 변환했습니다. 자세한 내용은 LSTMCellSimple 전환 코드
전환 계약:
가중치와 투영 텐서는 전치됩니다.
{input, recurrent}~{셀, 입력 게이트, 포겟 게이트, 출력 gate}는 전치된 가중치 텐서를 슬라이싱하여 추출됩니다.
{bias}부터 {bias} 사이의 값은 다음과 같습니다. 편향 텐서를 분할하여 추출해야 합니다.
프로젝션은 전치된 투영 텐서를 분할하여 추출됩니다.
유사한 전환이 다음에 대해 작성됨 LayerNormalizedLSTMCellSimple의 예시입니다.
다음을 포함한 LiteRT 변환 인프라의 나머지 부분은 MLIR 패스 LiteRT 플랫 버퍼로 최종 내보내기를 재사용됨
알려진 문제/제한사항
- 현재는 스테이트리스(Stateless) Keras LSTM(기본값은 동작). 스테이트풀(Stateful) Keras LSTM 변환은 미래 작업입니다.
- 스테이트풀(Stateful) Keras LSTM 레이어를 모델링하는 것은 여전히 스테이트리스(Stateless) Keras LSTM 계층을 사용하고 사용자 프로그램을 생성합니다. 이러한 TensorFlow 프로그램은 여전히 LiteRT를 생성할 수 있습니다.
- 양방향 LSTM은 현재 두 개의 단방향 시퀀스 LSTM로 모델링됩니다. 사용할 수 있습니다 이는 단일 양방향 시퀀스 LSTM 작업