TensorFlow.org에서 보기 |
소개
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 런타임을 통해 실행했습니다.
가이드
모델 작성
이 데모에서는 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의 일부를 인스턴스화하여 사전 훈련된 모델을 로드합니다. 이 코드 조각에서 다음과 같은 세 가지 모듈식 구성 요소도 확인할 수 있습니다.
Tokenizer : 원시 문자열 입력을 Keras Embedding 레이어에 적합한 정수 토큰 ID로 변환합니다. GPT-2는 특히 BPE(바이트 쌍 인코딩) 토크나이저를 사용합니다.
전처리기 : Keras 모델에 입력할 입력을 토큰화하고 패킹하기 위한 계층입니다. 여기서 전처리기는 토큰화 후 토큰 ID의 텐서를 지정된 길이(256)로 채웁니다.
백본 : SoTA 변환기 백본 아키텍처를 따르고 사전 설정된 가중치를 갖는 Keras 모델입니다.
또한 GitHub 에서 전체 GPT-2 모델 구현을 확인할 수 있습니다.
모델 변환
TensorFlow Lite는 모바일, 마이크로컨트롤러 및 기타 에지 장치에 메서드를 배포하기 위한 모바일 라이브러리입니다. 첫 번째 단계는 TensorFlow Lite 변환기를 사용하여 Keras 모델을 보다 컴팩트한 TensorFlow Lite 형식으로 변환한 다음 모바일 장치에 고도로 최적화된 TensorFlow Lite 인터프리터를 사용하여 변환된 모델을 실행하는 것입니다.
변환을 수행하는 GPT2CausalLM
의 generate()
함수로 시작하세요. 구체적인 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 툴킷을 확인하세요.