
IBM Spyre에서 구동하는 추론 서버로 엔티티 추출 시도해보기
요약
IBM Spyre AI 가속기를 활용하여 Granite 4.1 모델 기반의 추론 서버를 구축하고, 발주서 텍스트에서 엔티티를 추출하는 실습 가이드를 제공합니다. vLLM 백엔드와 Red Hat AI Inference를 사용하여 OpenAI 호환 API 환경을 구성하는 방법을 다룹니다.
핵심 포인트
- IBM Spyre 가속기를 vLLM 백엔드로 활용한 LLM 추론 서버 구축
- Red Hat AI Inference를 통한 OpenAI 호환 API 환경 구성
- Podman 컨테이너를 이용한 Spyre 기반 추론 서비스 기동 방법
- 시스템 프롬프트와 JSON 스키마를 활용한 구조화된 데이터 추출 실습
IBM Spyre는 IBM Power 서버에 탑재 가능한 AI 가속기(Accelerator)입니다.
PCIe 연결의 AIU(AI Unit) 디바이스로 인식되며, vLLM의 백엔드(Backend)로서 대규모 언어 모델(LLM)의 추론에 이용할 수 있습니다.
지금까지 작성한 Spyre 관련 기사는 이쪽
이번에는 Spyre 상에서 Granite 4.1 모델을 사용한 추론 서버를 구축하여, 발주서 텍스트로부터 엔티티(Entity, 구조화 데이터)를 추출하는 시나리오를 시도해 보겠습니다.
Red Hat AI Inference(RHAII)는 OpenAI 호환 API로서 구동되기 때문에, curl이나 기존의 OpenAI 클라이언트를 그대로 사용할 수 있다는 점이 편리합니다.
RHAII는 3.5의 Early access 버전을 사용하고 있습니다.
-
IBM Spyre 가속기 탑재 서버
-
모델:
granite-4.1-8b-fp8 -
컨테이너 런타임(Container Runtime): Podman
-
컨테이너 이미지(Container Image):
registry.redhat.io/rhaii-early-access/vllm-spyre-rhel9:3.5.0-ea.1-1781067361
이용할 AIU 디바이스나 모델 경로(Model Path), 배치 사이즈(Batch Size) 등을 환경 변수로 정의합니다.
# 이용할 AIU 디바이스의 PCIe 주소 (실제 환경의 주소로 변경)
export AIU_IDS="xxxx:xx:xx.x"
# 컨테이너에 마운트할 모델의 경로
...
다음의 podman run 명령으로 vLLM 서비스를 기동합니다.
podman run -it \
--name entity-ext \
--replace \
...
주요 옵션에 대한 보충 설명은 다음과 같습니다.
| 옵션 | 설명 |
|---|---|
AIU_PCIE_IDS | 사용하는 Spyre(AIU) 디바이스의 PCIe 주소를 지정 |
VLLM_SPYRE_USE_CB=1 | Spyre 고유의 Continuous Batching 모드를 활성화 |
-tp | 텐서 병렬도(Tensor Parallelism, 사용하는 AIU 수)를 지정 |
--enable-prefix-caching | 프리픽스 캐싱(Prefix Caching)을 활성화하여 동일한 시스템 프롬프트를 재사용할 때의 효율을 높임 |
기동 후 로그에 다음과 같은 출력이 흐르면 서비스가 정상적으로 기동된 것입니다.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
만약을 위해 curl로 통신 확인을 해두면 안심할 수 있습니다.
curl -s http://xxx.xxx.xxx.xxx:8000/health
{}나 200 OK가 반환되면 문제없습니다.
추론 서버가 기동되면 발주서 텍스트로부터의 엔티티 추출을 시도해 보겠습니다.
시스템 프롬프트(System Prompt)로 JSON 형식의 응답을 지시합니다.
당신은 발주서 텍스트로부터 정보를 추출하는 전문가입니다.
주어진 텍스트로부터 다음 JSON 포맷으로 정보를 추출해 주세요.
찾을 수 없는 정보는 빈 문자열 또는 0으로 보완해 주세요.
...
사용자 메시지(User Message)에는 출력 스키마(Schema)의 예시와 발주서 텍스트를 함께 전달합니다.
다음 발주서 텍스트로부터 정보를 추출하여, 다음 JSON 스키마에 따라 응답해 주세요.
스키마 예시:
{
...
엔드포인트(Endpoint) URL과 모델명을 변수로 정의해 둡니다.
INFERENCE_API_BASE_URL="http://xxx.xxx.xxx.xxx:8000"
INFERENCE_API_KEY=""
INFERENCE_MODEL_NAME="/models/granite-4.1-8b-fp8"
response_format에 json_object를 지정함으로써, 모델이 JSON만을 반환하도록 제어할 수 있습니다.
참고로, 이 기능은 모델에 따라 대응 여부가 다릅니다. Granite 4.1에서는 문제없이 동작했지만, 다른 모델을 사용할 경우에는 사전에 확인하시기 바랍니다.
curl -s -X POST "${INFERENCE_API_BASE_URL}/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${INFERENCE_API_KEY}" \
...
다음과 같은 JSON이 반환됩니다.
품목별로 상품명, 수량, 단가가 올바르게 분해되어 있으며, 합계 금액과 비고를 포함하여 구조화되어 있음을 확인할 수 있습니다.
{
"customer_name": "株式会社テック商事",
"customer_email": "order@example.co.jp",
...
자연어로 작성된 발주서로부터 구조화된 JSON을 정확하게 추출하고 있습니다.
IBM Spyre 상의 vLLM을 사용하여 발주서 텍스트로부터의 엔티티 추출 (Entity Extraction)을 시도해 보았습니다.
OpenAI 호환 API를 이용하고 있기 때문에, response_format: json_object를 지정하는 것만으로 JSON 출력을 강제할 수 있어 후속 파싱 (Parsing) 처리를 심플하게 유지할 수 있습니다.
프롬프트 (Prompt)에 스키마 (Schema) 예시를 포함함으로써, 필드 구성이 바뀌더라도 유연하게 대응할 수 있다는 점도 장점입니다.
실제 업무 활용을 위해서는 다음 사항들을 고려해 두는 것이 좋다고 생각합니다.
Spyre의 기동만 완료되면, 그 이후에는 일반적인 OpenAI 호환 클라이언트와 동일한 감각으로 사용할 수 있으므로 기존 처리 파이프라인 (Pipeline)에 통합하기도 쉬울 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기