LiteRT-LM을 사용하여 LLM 실행

LiteRT-LM은 휴대전화에서 임베디드 시스템에 이르기까지 다양한 기기에서 언어 모델 파이프라인을 효율적으로 실행하도록 설계된 교차 플랫폼 라이브러리입니다. 개발자에게 정교한 언어 모델 워크플로를 만들고 배포하는 도구를 제공하며, 이제 NPU가 원활하게 통합됩니다.

CPU 및 GPU에서 LLM 실행

크로스 플랫폼 개발 및 CPU/GPU 하드웨어 가속에 관한 자세한 안내는 LiteRT-LM GitHub 저장소를 참고하세요.

NPU에서 LLM 실행

NPU (Neural Processing Unit)는 딥 러닝 워크로드에 최적화된 특수 하드웨어 블록을 제공합니다. 이러한 기능은 특히 휴대기기에서 최신 시스템 온 칩 (SoC)에서 점점 더 많이 제공되고 있습니다. 고성능 특성으로 인해 LLM 추론을 실행하는 데 적합합니다.

NPU 공급업체

LiteRT-LM은 다음 공급업체와 함께 NPU 가속을 사용하여 LLM 실행을 지원합니다. 시도하려는 공급업체에 따라 안내를 선택하세요.

빠른 시작

시작하려면 먼저 기본 요건 안내에 따라 환경과 저장소를 설정하세요.

또한 Android 기기와 상호작용하려면 Android 디버그 브리지를 올바르게 설치하고 adb를 사용하여 액세스할 수 있는 연결된 기기가 있어야 합니다.

자세한 안내는 LiteRT-LM 저장소의 빠른 시작 섹션을 확인하고 litert_lm_main 명령줄 데모에 관한 자세한 내용을 참고하세요.

Qualcomm AI Engine Direct

Qualcomm NPU에서 LLM을 실행하는 단계는 다음과 같습니다.

1단계: .litertlm 모델 다운로드 LiteRT-LM 런타임은 .litertlm 형식의 모델과 함께 작동하도록 설계되었습니다. 호환되는 모델은 다음 표에서 찾아 다운로드할 수 있습니다.

모델 SoC 양자화 컨텍스트 크기 모델 크기 (Mb) 다운로드 링크
Gemma3-1B SM8750 채널당 4비트 1280 658 다운로드
Gemma3-1B SM8650 채널당 4비트 1280 658 다운로드
Gemma3-1B SM8550 채널당 4비트 1280 657 다운로드

SoC에 해당하는 모델을 다운로드해야 합니다. 다음은 휴대전화의 SoC에 맞는 모델을 다운로드할 수 있는 Hugging Face 링크를 가져오는 데 도움이 되는 명령어의 예입니다. 파일을 다운로드할 권한을 얻으려면 로그인하고 양식을 확인해야 합니다. adb를 사용하여 액세스할 수 있는 연결된 기기가 있는지 확인해야 합니다.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

$SOC_MODEL이 지원 표에 나열되어 있는지 확인합니다. 생성된 링크는 지원되지 않는 모델에서는 작동하지 않습니다. NPU 지원은 정기적으로 추가되므로 나중에 다시 확인하여 기기가 지원되는지 확인하세요.

2단계: QAIRT 라이브러리 다운로드 및 추출 Qualcomm NPU를 사용하여 모델을 실행하려면 기기에 연결된 런타임 라이브러리가 필요합니다. 링크에서 QAIRT SDK를 다운로드하고 파일을 추출할 수 있습니다. 버전 번호가 포함된 압축 해제된 폴더를 가리키도록 변수 QAIRT_ROOT를 설정합니다 (이후 단계에서 사용). 예를 들면 다음과 같습니다.

unzip <your_file.zip> -d ~/

QAIRT_ROOT=~/qairt/2.42.0.251225

3단계: LiteRT-LM 런타임 / 라이브러리 빌드

Linux에서 개발

Android용 바이너리를 빌드하려면 https://developer.android.com/ndk/downloads#stable-downloads에서 NDK r28b 이상을 설치해야 합니다. 구체적인 단계는 다음과 같습니다.

  • https://developer.android.com/ndk/downloads#stable-downloads에서 zip 파일을 다운로드합니다.
  • 원하는 위치 (예: /path/to/AndroidNDK/)에 zip 파일을 추출합니다.
  • ANDROID_NDK_HOME가 NDK 디렉터리를 가리키도록 합니다. 다음과 같이 표시됩니다.
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

팁: ANDROID_NDK_HOMEREADME.md이 있는 디렉터리를 가리키는지 확인하세요.

설정 후 litert_lm_main 바이너리를 빌드해 보세요.

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

또한 LiteRT-LM 런타임이 NPU와 상호작용할 수 있도록 디스패치 API 라이브러리를 빌드해야 합니다.

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

macOS에서 개발

Xcode 명령줄 도구에는 clang이 포함됩니다. 이전에 설치하지 않은 경우 xcode-select --install를 실행합니다.

Android용 바이너리를 빌드하려면 https://developer.android.com/ndk/downloads#stable-downloads에서 NDK r28b 이상을 설치해야 합니다. 구체적인 단계는 다음과 같습니다.

  • https://developer.android.com/ndk/downloads#stable-downloads에서 .dmg 파일을 다운로드합니다.
  • .dmg 파일을 열고 AndroidNDK* 파일을 원하는 위치 (예: /path/to/AndroidNDK/)로 이동합니다.
  • ANDROID_NDK_HOME가 NDK 디렉터리를 가리키도록 합니다. 다음과 같이 표시됩니다.
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

팁: ANDROID_NDK_HOMEREADME.md이 있는 디렉터리를 가리키는지 확인하세요.

설정 후 litert_lm_main 바이너리를 빌드해 보세요.

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

또한 LiteRT-LM 런타임이 NPU와 상호작용할 수 있도록 디스패치 API 라이브러리를 빌드해야 합니다.

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

4단계: 기기에서 모델 실행 바이너리가 성공적으로 빌드되면 이제 기기에서 모델을 실행해 볼 수 있습니다. DEVICE_FOLDER에 대한 쓰기 액세스 권한이 있는지 확인합니다.

Android 기기에서 바이너리를 실행하려면 몇 가지 애셋/바이너리를 푸시해야 합니다. 먼저 DEVICE_FOLDER를 설정하고 쓰기 액세스 권한이 있는지 확인합니다 (일반적으로 /data/local/tmp/ 아래에 항목을 배치할 수 있음).

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

.litertlm 파일을 푸시합니다. 도움말: 이러한 애셋은 한 번만 푸시하면 됩니다.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

QAIRT 라이브러리를 푸시합니다. 2단계 $QAIRT_ROOT/lib/aarch64-android/의 압축 해제된 폴더에서 찾을 수 있습니다. QAIRT_ROOT에는 버전 번호(예: 2.42.0.251225)가 포함되어야 합니다.

adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp*Stub.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnSystem.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtpPrepare.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/hexagon-*/unsigned/libQnnHtp*Skel.so $DEVICE_FOLDER

3단계에서 컴파일된 디스패치 API와 기본 바이너리를 푸시합니다.

adb push bazel-bin/external/litert/litert/vendors/qualcomm/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

이제 바이너리를 실행할 수 있습니다.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER ADSP_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm

MediaTek NeuroPilot

MediaTek NPU에서 LLM을 실행하는 단계는 다음과 같습니다.

1단계: .litertlm 모델 다운로드 LiteRT-LM 런타임은 .litertlm 형식의 모델과 함께 작동하도록 설계되었습니다. 호환되는 모델은 다음 표에서 찾아 다운로드할 수 있습니다.

모델 SoC 양자화 컨텍스트 크기 모델 크기 (Mb) 다운로드 링크
Gemma3-1B MT6989 채널당 4비트 1280 985 다운로드
Gemma3-1B MT6991 채널당 4비트 1280 986 다운로드

SoC에 해당하는 모델을 다운로드해야 합니다. 다음은 휴대전화의 SoC에 맞는 모델을 다운로드할 수 있는 Hugging Face 링크를 가져오는 데 도움이 되는 명령어의 예입니다. 파일을 다운로드할 권한을 얻으려면 로그인하고 양식을 확인해야 합니다. adb를 사용하여 액세스할 수 있는 연결된 기기가 있는지 확인해야 합니다.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

$SOC_MODEL이 지원 표에 나열되어 있는지 확인합니다. 생성된 링크는 지원되지 않는 모델에서는 작동하지 않습니다. NPU 지원은 정기적으로 추가되므로 나중에 다시 확인하여 기기가 지원되는지 확인하세요.

2단계: LiteRT-LM 런타임 / 라이브러리 빌드

Linux에서 개발

Android용 바이너리를 빌드하려면 https://developer.android.com/ndk/downloads#stable-downloads에서 NDK r28b 이상을 설치해야 합니다. 구체적인 단계는 다음과 같습니다.

  • https://developer.android.com/ndk/downloads#stable-downloads에서 zip 파일을 다운로드합니다.
  • 원하는 위치 (예: /path/to/AndroidNDK/)에 zip 파일을 추출합니다.
  • ANDROID_NDK_HOME가 NDK 디렉터리를 가리키도록 합니다. 다음과 같이 표시됩니다.
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

팁: ANDROID_NDK_HOMEREADME.md이 있는 디렉터리를 가리키는지 확인하세요.

설정 후 litert_lm_main 바이너리를 빌드해 보세요.

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

또한 LiteRT-LM 런타임이 NPU와 상호작용할 수 있도록 디스패치 API 라이브러리를 빌드해야 합니다.

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

macOS에서 개발

Xcode 명령줄 도구에는 clang이 포함됩니다. 이전에 설치하지 않은 경우 xcode-select --install를 실행합니다.

Android용 바이너리를 빌드하려면 https://developer.android.com/ndk/downloads#stable-downloads에서 NDK r28b 이상을 설치해야 합니다. 구체적인 단계는 다음과 같습니다.

  • https://developer.android.com/ndk/downloads#stable-downloads에서 .dmg 파일을 다운로드합니다.
  • .dmg 파일을 열고 AndroidNDK* 파일을 원하는 위치 (예: /path/to/AndroidNDK/)로 이동합니다.
  • ANDROID_NDK_HOME가 NDK 디렉터리를 가리키도록 합니다. 다음과 같이 표시됩니다.
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

팁: ANDROID_NDK_HOMEREADME.md이 있는 디렉터리를 가리키는지 확인하세요.

설정 후 litert_lm_main 바이너리를 빌드해 보세요.

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

또한 LiteRT-LM 런타임이 NPU와 상호작용할 수 있도록 디스패치 API 라이브러리를 빌드해야 합니다.

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

3단계: 기기에서 모델 실행 바이너리가 성공적으로 빌드되면 이제 기기에서 모델을 실행해 볼 수 있습니다. DEVICE_FOLDER에 대한 쓰기 액세스 권한이 있는지 확인합니다.

Android 기기에서 바이너리를 실행하려면 몇 가지 애셋/바이너리를 푸시해야 합니다. 먼저 DEVICE_FOLDER를 설정하고 쓰기 액세스 권한이 있는지 확인합니다 (일반적으로 /data/local/tmp/ 아래에 항목을 배치할 수 있음).

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

.litertlm 파일을 푸시합니다. 도움말: 이러한 애셋은 한 번만 푸시하면 됩니다.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

2단계에서 컴파일된 디스패치 API와 기본 바이너리를 푸시합니다.

adb push bazel-bin/external/litert/litert/vendors/mediatek/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

이제 바이너리를 실행할 수 있습니다.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm