자동 완성

TensorFlow.org에서 보기 Google Colab에서 실행

소개

LLM(대형 언어 모델)은 대규모 데이터 세트를 기반으로 텍스트를 생성하도록 훈련된 기계 학습 모델 클래스입니다. 텍스트 생성, 질문 응답, 기계 번역을 포함한 자연어 처리(NLP) 작업에 사용할 수 있습니다. 이는 Transformer 아키텍처를 기반으로 하며 종종 수십억 단어가 포함된 방대한 양의 텍스트 데이터에 대해 훈련됩니다. GPT-2와 같은 소규모 LLM도 인상적인 성능을 발휘할 수 있습니다. TensorFlow 모델을 더 가볍고 빠르며 저전력 모델로 변환하면 데이터가 기기를 떠나지 않기 때문에 더 나은 사용자 보안 이점과 함께 기기에서 생성 AI 모델을 실행할 수 있습니다.

이 런북에서는 Keras LLM을 실행하기 위해 TensorFlow Lite로 Android 앱을 빌드하는 방법을 보여주고 양자화 기술을 사용하여 모델 최적화에 대한 제안을 제공합니다. 그렇지 않으면 실행하는 데 훨씬 더 많은 양의 메모리와 더 큰 계산 능력이 필요합니다.

우리는 호환되는 모든 TFLite LLM이 연결할 수 있는 Android 앱 프레임워크를 오픈 소스로 제공했습니다. 다음은 두 가지 데모입니다.

  • 그림 1에서는 Keras GPT-2 모델을 사용하여 기기에서 텍스트 완성 작업을 수행했습니다.
  • 그림 2에서는 명령 조정 PaLM 모델 (15억 매개변수) 버전을 TFLite로 변환하고 TFLite 런타임을 통해 실행했습니다.

PaLM을 사용한 자동 완성
그림 1: Pixel 7에서 텍스트 완성을 수행하기 위해 기기에서 Keras GPT-2 모델(이 Codelab 에서 변환됨)을 실행하는 예. 데모에서는 속도 향상이 없는 실제 지연 시간을 보여줍니다.

PaLM을 사용한 자동 완성

그림 2: 15억 개의 매개변수를 사용하여 PaLM 모델 버전을 실행하는 예. 데모는 재생 속도 향상 없이 Pixel 7 Pro에서 녹화됩니다.

가이드

모델 작성

이 데모에서는 KerasNLP를 사용하여 GPT-2 모델을 가져옵니다. KerasNLP는 자연어 처리 작업을 위한 최첨단 사전 학습 모델을 포함하고 전체 개발 주기 동안 사용자를 지원할 수 있는 라이브러리입니다. KerasNLP 저장소 에서 사용 가능한 모델 목록을 볼 수 있습니다. 워크플로우는 기본적으로 사용할 때 최첨단 사전 설정된 가중치 및 아키텍처를 갖고 더 많은 제어가 필요할 때 쉽게 사용자 정의할 수 있는 모듈식 구성 요소로 구축되었습니다. GPT-2 모델 생성은 다음 단계에 따라 수행할 수 있습니다.

gpt2_tokenizer = keras_nlp.models.GPT2Tokenizer.from_preset("gpt2_base_en")

gpt2_preprocessor = keras_nlp.models.GPT2CausalLMPreprocessor.from_preset(
    "gpt2_base_en",
    sequence_length=256,
    add_end_token=True,
)

gpt2_lm =
keras_nlp.models.GPT2CausalLM.from_preset(
"gpt2_base_en",
preprocessor=gpt2_preprocessor
)

이 세 줄의 코드 중 한 가지 공통점은 from_preset() 메서드입니다. 이 메서드는 미리 설정된 아키텍처 및/또는 가중치에서 Keras API의 일부를 인스턴스화하여 사전 훈련된 모델을 로드합니다. 이 코드 조각에서 다음과 같은 세 가지 모듈식 구성 요소도 확인할 수 있습니다.

  1. Tokenizer : 원시 문자열 입력을 Keras Embedding 레이어에 적합한 정수 토큰 ID로 변환합니다. GPT-2는 특히 BPE(바이트 쌍 인코딩) 토크나이저를 사용합니다.

  2. 전처리기 : Keras 모델에 입력할 입력을 토큰화하고 패킹하기 위한 계층입니다. 여기서 전처리기는 토큰화 후 토큰 ID의 텐서를 지정된 길이(256)로 채웁니다.

  3. 백본 : SoTA 변환기 백본 아키텍처를 따르고 사전 설정된 가중치를 갖는 Keras 모델입니다.

또한 GitHub 에서 전체 GPT-2 모델 구현을 확인할 수 있습니다.

모델 변환

TensorFlow Lite는 모바일, 마이크로컨트롤러 및 기타 에지 장치에 메서드를 배포하기 위한 모바일 라이브러리입니다. 첫 번째 단계는 TensorFlow Lite 변환기를 사용하여 Keras 모델을 보다 컴팩트한 TensorFlow Lite 형식으로 변환한 다음 모바일 장치에 고도로 최적화된 TensorFlow Lite 인터프리터를 사용하여 변환된 모델을 실행하는 것입니다.

변환을 수행하는 GPT2CausalLMgenerate() 함수로 시작하세요. 구체적인 TensorFlow 함수를 생성하려면 generate() 함수를 래핑하세요.

@tf.function
def generate(prompt, max_length):
    """
    Args:
        prompt: input prompt to the LLM in string format
        max_length: the max length of the generated tokens
    """
    return gpt2_lm.generate(prompt, max_length)

concrete_func = generate.get_concrete_function(tf.TensorSpec([], tf.string), 100)

변환을 수행하기 위해 TFLiteConverter 에서 from_keras_model() 사용할 수도 있습니다.

이제 입력 및 TFLite 모델을 사용하여 추론을 실행할 도우미 함수를 정의합니다. TensorFlow 텍스트 작업은 TFLite 런타임에 내장된 작업이 아니므로 인터프리터가 이 모델을 추론할 수 있도록 이러한 사용자 정의 작업을 추가해야 합니다. 이 도우미 함수는 입력과 변환을 수행하는 함수, 즉 위에 정의된 generator() 함수를 허용합니다.

def run_inference(input, generate_tflite):
    interp = interpreter.InterpreterWithCustomOps(
        model_content=generate_tflite,
        custom_op_registerers=
            tf_text.tflite_registrar.SELECT_TFTEXT_OPS
    )

    interp.get_signature_list()

    generator = interp.get_signature_runner('serving_default')
    output = generator(prompt=np.array([input]))

이제 모델을 변환할 수 있습니다.

gpt2_lm.jit_compile = False
converter = tf.lite.TFLiteConverter.from_concrete_functions(
    [concrete_func],
    gpt2_lm)

converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops
    tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops
]
converter.allow_custom_ops = True
converter.target_spec.experimental_select_user_tf_ops = [
    "UnsortedSegmentJoin",
    "UpperBound"
]
converter._experimental_guarantee_all_funcs_one_use = True
generate_tflite = converter.convert()
run_inference("I'm enjoying a", generate_tflite)

양자화

TensorFlow Lite는 모델 크기를 줄이고 추론을 가속화할 수 있는 양자화 라는 최적화 기술을 구현했습니다. 양자화 프로세스를 통해 32비트 부동 소수점은 더 작은 8비트 정수로 매핑되므로 최신 하드웨어에서 보다 효율적인 실행을 위해 모델 크기를 4배로 줄입니다. TensorFlow에서 양자화를 수행하는 방법에는 여러 가지가 있습니다. 자세한 내용은 TFLite 모델 최적화TensorFlow 모델 최적화 툴킷 페이지를 방문하세요. 양자화 유형은 아래에 간략하게 설명되어 있습니다.

여기서는 변환기 최적화 플래그를 tf.lite.Optimize.DEFAULT 로 설정하여 GPT-2 모델에서 훈련 후 동적 범위 양자화를 사용하고 나머지 변환 프로세스는 이전에 자세히 설명한 것과 동일합니다. 우리는 이 양자화 기술을 사용하여 최대 출력 길이를 100으로 설정한 Pixel 7에서 지연 시간이 약 6.7초임을 테스트했습니다.

gpt2_lm.jit_compile = False
converter = tf.lite.TFLiteConverter.from_concrete_functions(
    [concrete_func],
    gpt2_lm)

converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops
    tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops
]
converter.allow_custom_ops = True
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.experimental_select_user_tf_ops = [
    "UnsortedSegmentJoin",
    "UpperBound"
]
converter._experimental_guarantee_all_funcs_one_use = True
quant_generate_tflite = converter.convert()
run_inference("I'm enjoying a", quant_generate_tflite)

다이내믹 레인지

동적 범위 양자화는 기기 내 모델을 최적화하기 위해 권장되는 시작점입니다. 모델 크기를 약 4배 줄일 수 있으며 교정을 위한 대표 데이터 세트를 제공하지 않고도 메모리 사용량을 줄이고 계산 속도를 높일 수 있으므로 권장되는 시작점입니다. 이러한 유형의 양자화는 변환 시 부동 소수점에서 8비트 정수까지의 가중치만 정적으로 양자화합니다.

FP16

부동 소수점 모델은 가중치를 float16 유형으로 양자화하여 최적화할 수도 있습니다. float16 양자화 의 장점은 모델 크기를 최대 절반으로 줄여(모든 가중치가 크기의 절반이 됨) 정확도 손실을 최소화하고 float16 데이터에서 직접 작동할 수 있는 GPU 대리자를 지원한다는 것입니다(이로 인해 float32보다 계산 속도가 빨라집니다) 데이터). float16 가중치로 변환된 모델은 추가 수정 없이 CPU에서 계속 실행될 수 있습니다. float16 가중치는 첫 번째 추론 전에 float32로 업샘플링됩니다. 이를 통해 대기 시간과 정확성에 미치는 영향을 최소화하는 대신 모델 크기를 줄일 수 있습니다.

완전 정수 양자화

전체 정수 양자화는 가중치와 활성화를 포함한 32비트 부동 소수점 숫자를 가장 가까운 8비트 정수로 변환합니다. 이러한 유형의 양자화를 통해 추론 속도가 향상된 더 작은 모델이 생성되며, 이는 마이크로컨트롤러를 사용할 때 매우 유용합니다. 이 모드는 활성화가 양자화에 민감한 경우에 권장됩니다.

안드로이드 앱 통합

Android 예제를 따라 TFLite 모델을 Android 앱에 통합할 수 있습니다.

전제 조건

아직 설치하지 않았다면 웹사이트의 지침에 따라 Android Studio를 설치하세요.

  • Android 스튜디오 2022.2.1 이상.
  • 4G 이상의 메모리를 갖춘 Android 장치 또는 Android 에뮬레이터

Android Studio를 사용한 빌드 및 실행

  • Android Studio를 열고 시작 화면에서 기존 Android Studio 프로젝트 열기를 선택합니다.
  • 표시되는 파일 또는 프로젝트 열기 창에서 TensorFlow Lite 샘플 GitHub 저장소를 복제한 위치에서 lite/examples/generative_ai/android 디렉터리로 이동하여 선택합니다.
  • 오류 메시지에 따라 다양한 플랫폼과 도구를 설치해야 할 수도 있습니다.
  • 변환된 .tflite 모델의 이름을 autocomplete.tflite 로 바꾸고 app/src/main/assets/ 폴더에 복사합니다.
  • 메뉴 빌드 -> 프로젝트 만들기를 선택하여 앱을 빌드합니다 . (버전에 따라 Ctrl+F9)
  • 메뉴 실행 -> '앱' 실행을 클릭합니다. (버전에 따라 Shift+F10)

또는 Gradle 래퍼를 사용하여 명령줄에서 빌드할 수도 있습니다. 자세한 내용은 Gradle 문서를 참조하세요.

(선택 사항) .aar 파일 빌드

기본적으로 앱은 필요한 .aar 파일을 자동으로 다운로드합니다. 그러나 직접 빌드하려면 app/libs/build_aar/ 폴더로 전환하여 ./build_aar.sh 를 실행하세요. 이 스크립트는 TensorFlow Text에서 필요한 작업을 가져오고 Select TF 운영자를 위한 aar을 구축합니다.

컴파일 후에는 새 파일 tftext_tflite_flex.aar 생성됩니다. app/libs/ 폴더의 .aar 파일을 교체하고 앱을 다시 빌드하세요.

Gradle 파일에 표준 tensorflow-lite aar를 포함해야 합니다.

컨텍스트 창 크기

앱에는 변경 가능한 매개변수 '컨텍스트 창 크기'가 있습니다. 이는 오늘날 LLM이 일반적으로 '프롬프트'로 모델에 공급할 수 있는 단어/토큰 수를 제한하는 고정된 컨텍스트 크기를 갖기 때문에 필요합니다('단어'가 반드시 필요한 것은 아닙니다). 이 경우에는 토큰화 방법이 다르기 때문에 '토큰'과 동일합니다.) 이 숫자는 다음과 같은 이유로 중요합니다.

  • 너무 작게 설정하면 모델에 의미 있는 출력을 생성할 만큼 충분한 컨텍스트가 없습니다.
  • 너무 크게 설정하면 모델에 작업할 공간이 충분하지 않습니다(출력 시퀀스에 프롬프트가 포함되므로).

실험해 볼 수 있지만 출력 시퀀스 길이의 ~50%로 설정하는 것이 좋은 시작입니다.

안전과 책임감 있는 AI

원래 OpenAI GPT-2 발표 에서 언급했듯이 GPT-2 모델에는 주목할만한 주의 사항과 제한 사항이 있습니다. 실제로 오늘날 LLM에는 일반적으로 환각, 공정성 및 편견과 같은 잘 알려진 문제가 있습니다. 이는 이러한 모델이 실제 데이터로 훈련되어 실제 문제를 반영하기 때문입니다.

이 Codelab은 TensorFlow 도구를 사용하여 LLM으로 구동되는 앱을 만드는 방법을 보여주기 위해서만 만들어졌습니다. 이 Codelab에서 생성된 모델은 교육 목적으로만 사용되며 프로덕션 용도로 사용되지 않습니다.

LLM 프로덕션을 사용하려면 신중한 교육 데이터 세트 선택과 포괄적인 안전 완화가 필요합니다. 이 Android 앱에서 제공되는 기능 중 하나는 잘못된 사용자 입력이나 모델 출력을 거부하는 욕설 필터입니다. 부적절한 언어가 감지되면 앱은 해당 작업을 거부합니다. LLM의 맥락에서 책임 있는 AI에 대해 자세히 알아보려면 Google I/O 2023에서 생성 언어 모델을 사용한 안전하고 책임 있는 개발 기술 세션을 시청하고 책임 있는 AI 툴킷을 확인하세요.