NVIDIA NIMs
NVIDIA NIMs
llama-index-embeddings-nvidia 패키지는 NVIDIA NIM 추론 마이크로서비스 위에서 모델로 애플리케이션을 구축하는 LlamaIndex 통합을 담아요. NIM은 커뮤니티와 NVIDIA의 채팅, 임베딩, 리랭킹 모델 등 다양한 도메인의 모델을 지원해요. 이 모델들은 NVIDIA 가속 인프라에서 최고 성능을 내도록 NVIDIA가 최적화했고, NVIDIA 가속 인프라에서 단일 명령으로 어디든 배포할 수 있는 사용하기 쉬운 사전 빌드 컨테이너인 NIM으로 배포돼요.
NVIDIA가 호스팅하는 NIM 배포는 NVIDIA API catalog에서 테스트할 수 있어요. 테스트 후에는 NVIDIA AI Enterprise 라이선스로 NVIDIA의 API catalog에서 NIM을 내보내 온프레미스나 클라우드에서 실행할 수 있으므로, 기업은 자체 IP와 AI 애플리케이션을 완전히 소유하고 통제할 수 있어요.
NIM은 모델별로 컨테이너 이미지로 패키징되며 NVIDIA NGC Catalog를 통해 NGC 컨테이너 이미지로 배포돼요. 핵심적으로 NIM은 AI 모델에서 추론을 실행하기 위한 쉽고 일관되며 익숙한 API를 제공해요.
출처: 문서
본문
설치 (Installation)
%pip install --upgrade --quiet llama-index-embeddings-nvidia
설정 (Setup)
시작하려면:
-
NVIDIA AI Foundation 모델을 호스팅하는 NVIDIA에서 무료 계정을 만드세요.
-
Retrieval탭을 선택한 다음 원하는 모델을 선택하세요. -
Input아래에서Python탭을 선택하고Get API Key를 클릭한 후Generate Key를 클릭하세요. -
생성된 키를
NVIDIA_API_KEY로 복사해 저장하세요. 그러면 엔드포인트에 접근할 수 있어요.
import getpass
import os
# del os.environ['NVIDIA_API_KEY'] ## delete key and reset
if os.environ.get("NVIDIA_API_KEY", "").startswith("nvapi-"):
print("Valid NVIDIA_API_KEY already in environment. Delete to reset")
else:
nvapi_key = getpass.getpass("NVAPI Key (starts with nvapi-): ")
assert nvapi_key.startswith(
"nvapi-"
), f"{nvapi_key[:5]}... is not a valid key"
os.environ["NVIDIA_API_KEY"] = nvapi_key
NVIDIA API Catalog 사용하기
임베딩 모델을 초기화할 때 모델 이름을 전달해(예: NV-Embed-QA) 모델을 선택하거나, 아무 인자도 전달하지 않아 기본값을 사용할 수 있어요.
from llama_index.embeddings.nvidia import NVIDIAEmbedding
embedder = NVIDIAEmbedding(model="NV-Embed-QA")
이 모델은 미세조정된 E5-large 모델로, 다음 Embeddings 메서드를 지원해요.
-
get_query_embedding: 쿼리 샘플에 대한 쿼리 임베딩을 생성해요. -
get_text_embedding_batch: 검색하려는 문서 목록에 대한 텍스트 임베딩을 생성해요. -
그리고 위 메서드들의 비동기 버전.
NVIDIA NIMs 사용하기
호스팅된 NVIDIA NIMs에 연결하는 것 외에도, 이 커넥터는 로컬 NIM 인스턴스에 연결하는 데도 사용할 수 있어요. 필요할 때 애플리케이션을 로컬로 가져갈 수 있게 도와줘요.
로컬 NIM 인스턴스를 설정하는 방법은 NVIDIA NIM을 참고하세요.
from llama_index.embeddings.nvidia import NVIDIAEmbedding
# Connect to an embedding NIM running at localhost:8080
embedder = NVIDIAEmbedding(base_url="http://localhost:8080/v1")
embedder.available_models
/home/raspawar/Desktop/llama_index/llama-index-integrations/embeddings/llama-index-embeddings-nvidia/llama_index/embeddings/nvidia/base.py:161: UserWarning: Default model is set as: NV-Embed-QA.
Set model using model parameter.
To get available models use available_models property.
warnings.warn(
[Model(id='NV-Embed-QA', base_model=None)]
유사도 (Similarity)
다음은 이 데이터 포인트들에 대한 유사도를 빠르게 테스트한 예시예요.
쿼리:
- What's the weather like in Komchatka?
- What kinds of food is Italy known for?
- What's my name? I bet you don't remember…
- What's the point of life anyways?
- The point of life is to have fun :D
텍스트:
- Komchatka's weather is cold, with long, severe winters.
- Italy is famous for pasta, pizza, gelato, and espresso.
- I can't recall personal names, only provide information.
- Life's purpose varies, often seen as personal fulfillment.
- Enjoying life's moments is indeed a wonderful approach.
쿼리 임베딩 (Embed queries)
print("\nSequential Embedding: ")
q_embeddings = [
embedder.get_query_embedding("What's the weather like in Komchatka?"),
embedder.get_query_embedding("What kinds of food is Italy known for?"),
embedder.get_query_embedding(
"What's my name? I bet you don't remember..."
),
embedder.get_query_embedding("What's the point of life anyways?"),
embedder.get_query_embedding("The point of life is to have fun :D"),
]
print("Shape:", (len(q_embeddings), len(q_embeddings[0])))
문서 임베딩 (Embed documents)
print("\nBatch Document Embedding: ")
d_embeddings = embedder.get_text_embedding_batch(
[
"Komchatka's weather is cold, with long, severe winters.",
"Italy is famous for pasta, pizza, gelato, and espresso.",
"I can't recall personal names, only provide information.",
"Life's purpose varies, often seen as personal fulfillment.",
"Enjoying life's moments is indeed a wonderful approach.",
]
)
print("Shape:", (len(d_embeddings), len(d_embeddings[0])))
이제 임베딩을 생성했으니, 결과에 대해 간단한 유사도 검사를 해서 검색 작업에서 어떤 문서가 합리적인 답으로 뽑혔을지 확인할 수 있어요.
%pip install --upgrade --quiet matplotlib scikit-learn
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# Compute the similarity matrix between q_embeddings and d_embeddings
cross_similarity_matrix = cosine_similarity(
np.array(q_embeddings),
np.array(d_embeddings),
)
# Plotting the cross-similarity matrix
plt.figure(figsize=(8, 6))
plt.imshow(cross_similarity_matrix, cmap="Greens", interpolation="nearest")
plt.colorbar()
plt.title("Cross-Similarity Matrix")
plt.xlabel("Query Embeddings")
plt.ylabel("Document Embeddings")
plt.grid(True)
plt.show()
참고로 시스템에 보낸 쿼리와 문서는 다음과 같아요.
쿼리:
- What's the weather like in Komchatka?
- What kinds of food is Italy known for?
- What's my name? I bet you don't remember…
- What's the point of life anyways?
- The point of life is to have fun :D
텍스트:
- Komchatka's weather is cold, with long, severe winters.
- Italy is famous for pasta, pizza, gelato, and espresso.
- I can't recall personal names, only provide information.
- Life's purpose varies, often seen as personal fulfillment.
- Enjoying life's moments is indeed a wonderful approach.
절단 (Truncation)
임베딩 모델은 보통 임베딩할 수 있는 최대 입력 토큰 수를 결정하는 고정 컨텍스트 창을 가져요. 이 한계는 모델의 최대 입력 토큰 길이와 같은 하드 한계일 수도 있고, 임베딩 정확도가 떨어지기 시작하는 유효 한계일 수도 있어요.
모델은 토큰 단위로 동작하고 애플리케이션은 보통 텍스트로 작업하므로, 애플리케이션이 입력을 모델의 토큰 한계 안에 유지하는 일은 까다로울 수 있어요. 기본적으로 입력이 너무 크면 예외가 발생해요.
이를 돕기 위해 NVIDIA NIM은 truncate 파라미터를 제공해서, 입력이 너무 크면 서버 쪽에서 입력을 절단할 수 있어요.
truncate 파라미터에는 세 가지 옵션이 있어요.
- "NONE": 기본 옵션. 입력이 너무 크면 예외가 발생해요.
- "START": 서버가 입력을 시작(왼쪽)에서부터 절단해서 필요한 만큼 토큰을 버려요.
- "END": 서버가 입력을 끝(오른쪽)에서부터 절단해서 필요한 만큼 토큰을 버려요.
long_text = "AI is amazing, amazing is " * 100
strict_embedder = NVIDIAEmbedding()
try:
strict_embedder.get_query_embedding(long_text)
except Exception as e:
print("Error:", e)
truncating_embedder = NVIDIAEmbedding(truncate="END")
truncating_embedder.get_query_embedding(long_text)[:5]