PCIe를 통해 GenAI 모델 실행하기
| 필드 | 값 |
|---|---|
| 범주 | PCIe 코프로세싱 |
| 난이도 | 중급 |
| 예상 소요 시간 | 15 minutes |
| 레이블 | PCIe, GenAI, LLM, VLM, Whisper |
각 예제는 호스트의 준비된 LLiMa 모델 디렉터리를 로드하고, 한도가 있는 요청을 실행한 뒤 모델을 닫습니다. 먼저 예제를 각각 실행하세요. 연결 설정은 같지만 요청 입력은 다릅니다.
둘러보기
LLM 로드하기
C++에서는 pcie::genai::GenAIModel, Python에서는 pyneatpcie.genai.GenAIModel을 생성합니다. 생성 시 카드에 모델을 로드하므로 build() 호출이나 큐 선택이 필요하지 않습니다. connection.card_id로 카드를 선택합니다. 절대 모델 경로와 현재 작업 디렉터리 기준 상대 경로를 사용할 수 있습니다.
genai::GenAIModel model(args.model, args.connection);
if (!model.accepts_text() || model.task() == genai::GenAITask::ASR)
throw std::invalid_argument("choose a text-generation model directory");
텍스트 요청 보내기
prompt와 max_new_tokens를 설정하고 run()을 호출합니다. 결과에는 답변 텍스트와 생성 지표가 포함됩니다. 예제의 기본 생성 한도는 128토큰이며, --max-tokens로 변경할 수 있습니다.
genai::GenerationRequest request;
request.prompt = args.prompt;
request.max_new_tokens = args.max_tokens;
if (!args.stream) {
const auto result = model.run(request);
std::cout << result.text << '\n';
std::cout << "Generated tokens: " << result.metrics.generated_tokens << '\n';
}
답변 스트리밍하기
LLM 예제에 --stream을 전달하면 대신 TokenSample 값을 순회합니다. 각 텍스트 조각이 도착하는 즉시 출력하세요. 마지막 샘플에는 완료된 생성 지표가 포함됩니다. 모델 하나당 한 번에 하나의 요청만 활성화할 수 있습니다.
auto stream = model.stream(request);
for (const auto& sample : stream) {
std::cout << sample.text << std::flush;
if (sample.is_final)
std::cout << "\nGenerated tokens: " << sample.metrics.generated_tokens << '\n';
}
모델 닫기
C++는 추론 후 close()를 명시적으로 호출하고, 예외로 예제가 중단되면 소멸자가 정리합니다. Python은 컨텍스트 관리자를 사용하여 오류가 발생하더라도 블록을 나갈 때 모델을 닫습니다. 연결 제한 시간은 시작에 15분, 요청에 5분입니다.
model.close();
RGB 이미지 준비하기
VLM 예제는 호스트에서 OpenCV로 이미지를 읽고, BGR을 RGB로 변환하여 형태가 [H, W, 3]인 연속 UInt8 픽셀을 만듭니다. C++는 픽셀을 소유하는 벡터를 PCIe 텐서로 감싸고, Python은 NumPy 배열을 제공합니다. 픽셀을 정규화하거나 카드 로컬 이미지 경로로 대체하지 마세요.
const auto bgr = cv::imread(args.media, cv::IMREAD_COLOR);
if (bgr.empty())
throw std::invalid_argument("cannot read image: " + args.media);
cv::Mat rgb;
cv::cvtColor(bgr, rgb, cv::COLOR_BGR2RGB);
if (!rgb.isContinuous())
rgb = rgb.clone();
auto image = pcie::Tensor::from_vector(
std::vector<std::uint8_t>(rgb.data, rgb.data + rgb.total() * rgb.elemSize()),
{rgb.rows, rgb.cols, 3}, "", pcie::PixelFormat::RGB);
이미지에 대해 질문하기
VLM을 로드하고 프롬프트와 함께 RGB 입력을 request.images에 첨부합니다. 이미지 전처리는 모델이 처리합니다. 반환된 텍스트가 질문에 대한 답변이며, PCIe 요청에는 이미지 파일 필드가 없습니다.
genai::GenAIModel model(args.model, args.connection);
if (!model.accepts_image())
throw std::invalid_argument("choose a vision-language model directory");
genai::GenerationRequest request;
request.prompt = args.prompt;
request.images = {image};
request.max_new_tokens = args.max_tokens;
std::cout << model.run(request).text << '\n';
model.close();
Whisper로 음성 전사하기
Whisper 디렉터리를 로드하고 audio_file에 호스트 오디오 경로를 설정합니다. language="auto"로 언어를 감지하거나 --language로 원본 언어를 지정합니다. 기본 동작은 전사이며, --translate는 영어 번역을 선택합니다. 전사문, 언어, 선택적 비음성 확률을 확인하세요. ASR 요청에는 채팅 프롬프트를 추가하지 마세요.
genai::GenAIModel model(args.model, args.connection);
if (model.task() != genai::GenAITask::ASR || !model.accepts_audio())
throw std::invalid_argument("choose a Whisper model directory");
genai::GenerationRequest request;
request.audio_file = args.media;
request.language = args.language;
request.asr_task = args.translate ? genai::ASRTask::Translate : genai::ASRTask::Transcribe;
const auto result = model.run(request);
std::cout << result.text << '\n';
std::cout << "Language: " << result.language << '\n';
if (result.no_speech_prob)
std::cout << "No-speech probability: " << *result.no_speech_prob << '\n';
model.close();
실행
PCIe 호스트 설치와 튜토리얼 준비를 따르세요. PCIe GenAI API를 제공하는 서로 호환되는 호스트 및 카드 패키지를 사용합니다. 아래 모든 명령은 호스트에서 압축 해제한 PCIe extras 루트를 기준으로 실행하세요.
준비된 모델 다운로드하기
이 SiMa.ai Model Zoo 저장소에는 이미 컴파일된 LLiMa 아티팩트가 포함되어 있습니다: Qwen3, LFM2-VL, Whisper. 실행할 모델만 다운로드하세요. 모델 카드를 확인하고 설치된 플랫폼과 호환되는 아티팩트를 사용하세요.
source ~/pyneatpcie/bin/activate
python -m pip install huggingface_hub opencv-python
mkdir -p models
hf download simaai/Qwen3-0.6B-Autoround-a16w4 \
--local-dir models/Qwen3-0.6B-Autoround-a16w4
hf download simaai/LFM2-VL-450M-Autoround-a16w4 \
--local-dir models/LFM2-VL-450M-Autoround-a16w4
hf download simaai/whisper-small-a16w8 \
--local-dir models/whisper-small-a16w8
토크나이저, 설정, 컴파일된 아티팩트를 포함하여 각 디렉터리를 온전히 유지하세요. 압축 해제나 카드로의 수동 복사는 필요하지 않습니다. 원본 Hugging Face 체크포인트는 준비된 LLiMa 디렉터리가 아닙니다. 사용자 지정 모델은 이 튜토리얼을 실행하기 전에 LLiMa로 GenAI 사용하기를 따르세요.