서론
텍스트 생성은 혁신적인 기능으로 등장하여, 기계가 인간과 유사한 텍스트를 해석하고 생성하는 방식을 변화시켰습니다. 이러한 인기 급증으로 인해 LLM 작업을 간소화하고 향상시키는 다양한 도구가 개발되었습니다.
거의 매주 새로운 버전이 등장하는 대규모 언어 모델의 급속한 확장으로, 이 기술을 지원하는 호스팅 옵션도 함께 증가했습니다. 많은 도구 중에서 Hugging Face의 텍스트 생성 추론(TGI)이 두드러지며, 이를 통해 로컬 머신에서 LLM을 서비스로 실행할 수 있습니다.
이 가이드에서는 Hugging Face TGI가 왜 중요한 혁신인지, 그리고 이를 사용하여 점점 더 인간의 글쓰기와 구별하기 어려운 텍스트를 생성하는 정교한 AI 모델을 개발하는 방법을 자세히 알아보겠습니다.
Hugging Face 텍스트 생성 추론이란?
Hugging Face 텍스트 생성 추론(TGI)은 Rust와 Python으로 작성된 프레임워크로, 대규모 언어 모델을 배포하고 서빙하기 위한 것입니다. 이 목적을 위해 설계된 프로덕션 레디 툴킷입니다.
Hugging Face는 TGI를 HFOILv1.0 라이선스 하에 개발 및 배포하며, 제품 또는 서비스 내에서 보조 도구로 기능할 경우 상업적 사용을 허용합니다(주요 기능이 아닌 경우). 이 툴킷이 해결하는 주요 과제는 다음과 같습니다:
Hugging Face 텍스트 생성 추론(TGI)의 주요 기능
1. 고성능 텍스트 생성
— TGI는 텐서 병렬화(대형 모델을 여러 GPU에 분산)와 동적 배치(서버 내에서 프롬프트를 즉시 그룹화)와 같은 기법을 사용하여 StarCoder, BLOOM, GPT-NeoX, Llama, T5 등 인기 있는 오픈소스 LLM의 성능을 최적화합니다.
2. 효율적인 리소스 사용
— TGI는 연속 배치, 최적화된 코드, 텐서 병렬화를 사용하여 여러 요청을 동시에 처리하면서 리소스 사용을 최소화합니다.
3. 유연성과 안전성
— TGI는 워터마킹, 로짓 왜곡(특정 토큰의 로짓에 바이어스 값을 주입하여 수정), 중지 시퀀스 등 다양한 안전 및 보안 기능을 지원하여 책임감 있고 통제된 LLM 사용을 보장합니다.
Hugging Face는 TGI를 통해 LLaMA, Falcon7B, Mistral 등 인기 모델을 포함한 일부 LLM의 아키텍처를 최적화하여 더 빠르게 실행할 수 있도록 했습니다. 지원되는 전체 모델 목록은 해당 문서에서 확인할 수 있습니다.
Hugging Face TGI를 사용해야 하는 이유?
Hugging Face는 자연어 처리 능력을 갖춘 AI 개발을 위한 핵심 플랫폼이 되었습니다. 이 플랫폼은 수많은 선도적인 오픈소스 모델을 호스팅하여 NLP 혁신의 강자로 자리 잡았습니다. 전통적으로 이러한 모델은 로컬에서 실행하기에는 너무 커서 클라우드 기반 서비스에 의존해야 했습니다.
그러나 QLoRa 및 GPTQ와 같은 양자화 기술의 최근 발전으로 일부 LLM을 로컬 컴퓨터를 포함한 일상적인 장치에서도 관리할 수 있게 되었습니다.
Hugging Face TGI는 로컬 머신에서 LLM을 서비스로 사용할 수 있도록 특별히 설계되었습니다. 이 접근 방식은 모델을 백그라운드에 준비 상태로 유지하여 각 프롬프트에 대한 긴 대기 시간을 피함으로써 LLM을 부팅하는 문제를 해결합니다. 언제든지 텍스트를 생성할 수 있는 최고의 언어 모델 모음이 있는 엔드포인트를 상상해 보세요.
TGI의 뛰어난 점은 간단한 구현입니다. 다양한 간소화된 모델 아키텍처를 지원하여 배포가 빠르고 쉽습니다.
또한 TGI는 이미 여러 라이브 프로젝트에서 사용되고 있습니다. 몇 가지 예시는 다음과 같습니다:

- Hugging Chat: 오픈 액세스 모델을 위한 오픈소스 인터페이스.
- OpenAssistant: LLM 훈련을 위한 오픈소스 커뮤니티 이니셔티브.
- nat.dev: LLM을 탐색하고 비교하기 위한 플랫폼.
그러나 주목할 만한 한계가 있습니다: TGI는 ARM 기반 GPU Mac(M1 시리즈 이후 모델 포함)과 아직 호환되지 않습니다.
Hugging Face TGI 설정
먼저 Hugging Face TGI 엔드포인트를 설정합니다.

로컬에 Hugging Face TGI를 설치하고 실행하려면 먼저 Rust를 설치합니다. 그런 다음 Python 3.9 이상의 가상 환경을 설정합니다(예: conda 사용):
#Rust 설치
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
#Python 가상 환경 생성
conda create -n text-generation-inference python=3.9
conda activate text-generation-inference
또한 Protoc를 설치하는 것이 필수적입니다. Hugging Face는 최상의 호환성을 위해 버전 21.12를 권장합니다. 이 설치를 위해서는 sudo 권한이 필요합니다.
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
먼저 처음부터 설치하는 과정을 설명하겠습니다. 이 과정은 간단하지 않을 수 있습니다. 문제가 발생하면 Docker 이미지를 직접 사용하는 것으로 건너뛸 수 있으며, 이 방법이 더 간단합니다. 두 시나리오 모두 다루겠습니다.
모든 필수 조건이 충족되면 TGI 설정을 진행할 수 있습니다. 먼저 GitHub 저장소를 클론합니다:
git clone https://github.com/huggingface/text-generation-inference.git
그런 다음 로컬 머신의 TGI 디렉토리로 이동하여 다음 명령어로 설치합니다:
cd text-generation-inference/
BUILD_EXTENSIONS=False make install
이제 Docker 유무에 관계없이 TGI를 사용하는 방법을 살펴보겠습니다. 데모를 위해 Apache 2.0 라이선스 하에 있는 Falcon-7B 모델을 사용하겠습니다.
Docker 없이 모델 실행
설치 과정에서 TGI 서버를 시작하는 새로운 명령어 “text-generation-launcher”가 생성되었습니다. Falcon-7B 모델을 사용하여 엔드포인트를 활성화하려면 다음 명령어를 실행하면 됩니다:
text-generation-launcher --model-id tiiuae/falcon-7b-instruct --num-shard 1 --port 8080 --quantize bitsandbytes
각 입력 매개변수에 대한 설명:
- model-id: Hugging Face Hub에 등록된 모델의 특정 이름입니다. Falcon-7B의 경우 “tiiuae/falcon-7b-instruct”입니다.
- num-shard: 사용 가능한 GPU 수에 맞게 조정합니다. 기본값은 1입니다.
- port: 서버가 요청을 수신할 포트를 지정합니다. 기본 포트는 8080입니다.
- quantize: VRAM이 24GB 미만인 GPU를 사용하는 경우 메모리 오버로드를 방지하기 위해 모델 양자화가 필요합니다. 위 명령어에서는 “bitsandbytes”를 선택하여 즉시 양자화합니다. 또 다른 옵션으로 “GPTQ” (“gptq”)도 있지만, 작동 방식이 덜 익숙할 수 있습니다.
TGI 응용 프로그램
텍스트 생성 추론(TGI) 서버를 애플리케이션에 통합하는 방법은 여러 가지가 있습니다. 서버가 작동 중이면 /generate 엔드포인트에 POST 요청을 보내 결과를 얻을 수 있습니다.

TGI로 연속 토큰 스트리밍을 선택하는 경우, 다음 섹션에서 설명하는 대신 엔드포인트를 사용하세요. 이러한 요청은 curl, Python, TypeScript 등 선호하는 도구를 사용하여 수행할 수 있습니다. TGI가 서빙하는 모델을 Python 스크립트로 쿼리하려면 다음 text-generation 라이브러리를 설치해야 합니다. 다음 pip 명령어로 간단히 설치할 수 있습니다:
pip install text-generation
TGI 서버를 시작한 후, 모델 서빙 엔드포인트의 URL로 InferenceClient() 인스턴스를 생성합니다. 그런 다음 text_generation()을 호출하여 Python으로 엔드포인트에 요청을 보낼 수 있습니다.
from text_generation import Client
client = Client("http://127.0.0.1:8080")
client.text_generation(prompt="Your prompt here!")
InferenceClient로 스트리밍을 활성화하려면 stream=True로 설정하기만 하면 됩니다. 그러면 서버에서 생성되는 대로 토큰을 실시간으로 받을 수 있습니다. 스트리밍 사용 방법은 다음과 같습니다:
for token in client.text_generation("Your prompt here!", max_new_tokens=12, stream=True):
print(token)
TGI를 통한 모델 프롬프트
엔드포인트에 배포된 모델(이 경우 Falcon-7B)과 상호작용한다는 점을 기억하세요. TGI를 통해 선택한 LLM에서 응답을 검색할 수 있는 라이브 엔드포인트를 설정합니다.
결과적으로 Python을 사용하면 포트 8080을 통해 로컬 장치에서 호스팅되는 클라이언트를 통해 직접 LLM에 프롬프트를 보낼 수 있습니다. 따라서 해당 Python 스크립트는 다음과 같습니다:
from text_generation import Client
client = Client("http://127.0.0.1:8080")
print(client.generate("Translate the following sentence into spanish: 'What does Large Language Model mean?'", max_new_tokens=500).generated_text)
환경에 모델을 설치하지 않고도 모델에서 응답을 받을 수 있습니다. Python 대신 CURL로 LLM을 쿼리할 수도 있습니다. 예시는 다음과 같습니다:
curl 127.0.0.1:8080/generate \
-X POST \
-d '{"inputs":"Code in Javascript a function to remove all spaces in a string and then print the string twice.","parameters":{"max_new_tokens":500}}' \
-H 'Content-Type: application/json'
TGI를 실험해 보면 인상적인 속도를 보여줍니다. Falcon-7B(토큰 제한 500)를 사용하는 경우 몇 초밖에 걸리지 않습니다. 반면 transformers 라이브러리를 사용하는 일반적인 추론 접근 방식은 약 30초가 소요됩니다.
novita.ai의 LLM을 사용한 novita.ai와의 통합

버전 1.4.0부터 TGI는 novita.ai의 LLM API와 호환되는 API를 도입했습니다. 이 새로운 Messages API를 통해 고객과 사용자가 novita.ai 모델에서 오픈소스 LLM으로 원활하게 전환할 수 있습니다. 이 API는 novita.ai의 클라이언트 라이브러리 또는 LangChain이나 LlamaIndex와 같은 타사 도구와 직접 통합할 수 있도록 설계되었습니다.

TGI의 Messages 지원으로 인해 Inference Endpoints가 novita.ai LLM API와 완전히 호환됩니다. 이 호환성을 통해 사용자는 novita.ai 모델을 사용하는 기존 스크립트를 TGI 엔드포인트에서 호스팅되는 오픈 LLM으로 쉽게 교체할 수 있습니다.
이 업그레이드를 통해 원활한 전환이 가능하며, 오픈소스 모델의 광범위한 장점에 즉시 액세스할 수 있습니다:
모델과 데이터에 대한 완전한 통제 및 투명성. 속도 제한에 대한 걱정 제거. 고유한 요구 사항에 맞게 시스템을 조정할 수 있는 유연성. TGI를 novita.ai 채팅 완료 프로토콜에 통합하는 방법의 예시는 아래와 같습니다:
from openai import OpenAI
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
# NovitaAI API 키 얻기: https://novita.ai/get-started/Quick_Start.html#_3-create-an-api-key
api_key="<YOUR NovitaAI API Key>",
)
model = "meta-llama/llama-3-8b-instruct"
stream = True # or False
max_tokens = 512
chat_completion_res = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": "Act like you are a helpful assistant.",
},
{
"role": "user",
"content": "Hi there!",
}
],
stream=stream,
max_tokens=max_tokens,
)
if stream:
for chunk in chat_completion_res:
print(chunk.choices[0].delta.content or "", end="")
else:
print(chat_completion_res.choices[0].message.content)
보시다시피 novita.ai 라이브러리를 사용하여 ENDPOINT와 Hugging Face 비밀번호를 지정할 수 있습니다. 이 통합에 대한 자세한 내용은 Hugging Face TGI 문서를 참조하세요.
TGI 사용 시 실용적인 팁
LLM의 핵심 개념
HuggingFace TGI에 뛰어들기 전에 대규모 언어 모델에 대한 좋은 이해가 중요합니다. 토큰화, 어텐션 메커니즘, 트랜스포머 아키텍처와 같은 핵심 개념을 숙지하세요. 이러한 기본 사항은 모델을 맞춤화하고 텍스트 생성 결과를 향상시키는 데 필수적입니다.
모델 준비 및 최적화 — Hugging Face 이해하기
특정 요구 사항에 맞게 모델을 준비하고 최적화하는 방법을 알아보세요. 여기에는 적절한 모델 선택, 토크나이저 사용자 정의, 품질 저하 없이 성능을 개선하는 기법 적용이 포함됩니다.
HuggingFace가 어떻게 작동하는지, 그리고 NLP 개발을 위해 HuggingFace Hub를 사용하는 방법을 익히세요. 좋은 시작점은 “An Introduction to Using Transformers and Hugging Face” 튜토리얼입니다.
파인튜닝의 개념을 이해하는 것도 필수적입니다. 모델은 종종 특정 목표에 맞게 최적화되어야 하기 때문입니다. “An Introductory Guide to Fine-Tuning LLMs” 가이드를 통해 모델을 파인튜닝하는 방법을 배울 수 있습니다.
생성 전략
탐욕적 검색, 빔 검색, top-k 샘플링 등 텍스트 생성에 대한 다양한 접근 방식을 조사하세요. 각 방법에는 장단점이 있으며, 생성된 텍스트의 일관성, 창의성, 관련성에 영향을 미칩니다.
결론
Hugging Face의 TGI 툴킷을 통해 개인도 AI 텍스트 생성에 깊이 빠져들 수 있습니다. 이 툴킷은 인간과 유사한 텍스트를 요구하는 정교한 NLP 애플리케이션을 위해 LLM을 배포하고 호스팅할 수 있는 사용자 친화적인 도구를 제공합니다.
대규모 언어 모델을 자체 호스팅하면 데이터 프라이버시와 비용 제어가 가능하지만 강력한 하드웨어가 필요합니다. 그러나 최근 분야의 발전으로 더 작은 모델을 로컬 머신에서 직접 사용할 수 있게 되었습니다.
novita.ai는 무한한 창의성을 위한 원스톱 플랫폼으로, 100개 이상의 API에 접근할 수 있습니다. 이미지 생성, 언어 처리, 오디오 향상, 비디오 조작에 이르기까지 저렴한 종량제 방식으로 GPU 유지 관리의 번거로움 없이 자체 제품을 구축할 수 있습니다. 지금 무료로 체험해 보세요.
추천 자료
