2024년 3월 16일 토요일

GPU 없는 로컬에서 서비스 가능한 경량 소형 LLM, LLAMA2.c 빌드, 실행, 학습 및 코드 분석하기

이 글은 GPU 없는 컴퓨터에서 경량 LLAMA2.c (라마씨)를 빌드하고, 로컬에서 실행, 학습하는 방법을 간략히 따라해 본다.
LLAMA2.c

머리말
앞서 설명한 코드 라마2는 최소 28GB이상의 GPU RAM이 필요하다. 많은 개발자의 경우, 현재 시점에서 이 정도 수준의 GPU 스펙 장비를 가진 경우는 매우 드물다. CoLab의 경우 T4 GPU는 16GB 크기를 가진다. 그러므로, 이를 해결할 수 있는 솔류션이 개발되었다. 

LLAMA2.c는 OpenAI 엔지니어인 Andrej Karpathy가 개발한 라마2를 이용한 소형 LLM 오픈소스 프로젝트이다. 이 라마 코드는 순수 C로 개발되었으며, 모델은 겨우 100MB로 동작되어, GPU가 없는 로컬 PC에서도 가볍게 실행된다. 

LLAMA.c 설치
설치, 실행 및 학습 방법은 다음과 같다. 터미널에서 다음 명령을 실행한다.
cd llama2.c
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin

이 결과, https://huggingface.co/datasets/roneneldan/TinyStories 으로 학습된 모델이 다운로드된다.

실행하기
코드를 컴파일하고, 다운로드받은 스토리 학습 모델을 실행한다. 
make run
./run stories15M.bin

실행 결과는 다음과 같다. 텍스트가 잘 생성되는 것을 확인할 수 있다.

좀 더 큰 모델을 다운받아 실행해 본다.
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories42M.bin
./run stories42M.bin
./run stories42M.bin -t 0.8 -n 256 -i "One day, Lily met a Shoggoth"


다음과 같이, 접두어, 추가 명령줄 인수를 지정할 수도 있다.
-t: 생성 온도. 0~1.0
 
데이터 학습 방법
새로운 데이터 훈련을 위해서는 앞에서 사용한 스토리 모델이 어떻게 학습되었는지 확인해 볼 필요가 있다. 그 방법은 다음과 같다.
python tinystories.py download
python tinystories.py pretokenize
python train.py

학습 데이터 다운로드 화면 일부

이제 컴파일을 한다. 
make run

다음과 같이 실행하면 된다. 
./run stories15M.bin

코드 및 학습 데이터 분석하기
LLAMA2.c의 구조는 매우 간단한데, make파일을 분석해 보면 단 하나의 run.c를 컴파일해 실행파일을 빌드하는 것을 확인할 수 있다.
gcc -O3 -o run run.c -lm

run.c의 주요 부분을 살펴보면 다음과 같다. 
typedef struct {
    // token embedding table
    float* token_embedding_table;    // (vocab_size, dim)
    // weights for rmsnorms
    float* rms_att_weight; // (layer, dim) rmsnorm weights
    float* rms_ffn_weight; // (layer, dim)
    // weights for matmuls. note dim == n_heads * head_size
    float* wq; // (layer, dim, n_heads * head_size)
    float* wk; // (layer, dim, n_kv_heads * head_size)
    float* wv; // (layer, dim, n_kv_heads * head_size)
    float* wo; // (layer, n_heads * head_size, dim)
    // weights for ffn
    float* w1; // (layer, hidden_dim, dim)
    float* w2; // (layer, dim, hidden_dim)
    float* w3; // (layer, hidden_dim, dim)
    // final rmsnorm
    float* rms_final_weight; // (dim,)
    // (optional) classifier weights for the logits, on the last layer
    float* wcls;
} TransformerWeights;

이 구조체의 이름은 TransformerWeights이며, 이는 Transformer 모델의 가중치를 저장하는 데 사용된다. 트랜스포머의 어텐션 스코어를 계산하는 데 핵심적인 자료구조이다. 각 필드는 다음과 같은 의미를 가진다:
  • token_embedding_table: 토큰 임베딩 테이블을 나타낸다. 이는 어휘 크기(vocab_size)와 차원(dim)의 2차원 배열이다.
  • rms_att_weight, rms_ffn_weight: RMSNorm의 가중치를 나타낸다. 각각 attention과 feed-forward network에 대한 것이다.
  • wq, wk, wv, wo: 각각 query, key, value, output에 대한 가중치를 나타낸다. 이들은 multi-head attention에서 사용된다.
  • w1, w2, w3: feed-forward network에서 사용되는 가중치이다.
  • rms_final_weight: 최종 RMSNorm의 가중치를 나타낸다.
  • wcls: (선택적으로) 마지막 레이어에서 로짓에 대한 분류기 가중치를 나타낸다.
  • 이 구조체는 Transformer 모델의 가중치를 저장하고 관리하는 데 사용된다.
전체적인 프로그램 실행 구조는 다음과 같다. 

1. 이 코드는 트랜스포머 모델의 구성, 가중치 및 상태에 대한 구조와 메모리 할당, 메모리 해제 및 체크포인트 읽기 기능을 정의한다.
2. 'rmsnorm', 'softmax', 'matmul'과 같은 신경망 블록을 위한 함수도 포함되어 있다.
3. 코드는 Transformer 모델을 통해 입력 토큰을 처리하여 출력 로짓을 생성하는 'forward' 함수를 구현한다.
4. 또한 BPE(Byte Pair Encoding) 토크나이저가 문자열을 토큰으로 또는 그 반대로 변환하는 구조와 함수가 있다.
5. 코드에는 argmax, 샘플링 및 top-p 샘플링과 같은 다양한 전략을 사용하여 확률을 기반으로 토큰을 샘플링하는 '샘플러' 구조와 함수가 포함된다.
6. 시간 측정을 위한 유틸리티 기능과 Transformer 모델을 기반으로 텍스트를 생성하는 '생성' 기능을 정의한다.
7. 마지막으로 트랜스포머 모델을 사용하여 사용자와 어시스턴트 간의 대화를 시뮬레이션하는 '채팅' 기능을 정의한다.  
전체 프로그램 구조도

앞에서 사용된 1.5GB가 넘는 스토리 학습 데이터의 구조는 다음과 같이 되어 있다.
학습 데이터 구조 일부

이를 본인의 목적에 맞게 적절히 데이터를 준비한 후, 다음과 같이 동일한 방식으로 학습하면 가중치 벡터가 저장된 bin파일을 얻을 수 있다. 이를 이용해, 앞서 언급된 방식과 동일하게 사용하면 된다.

레퍼런스

2024년 3월 13일 수요일

오픈소스 기반 프로젝트 문서, 버전 및 지식 관리 도구 소개

이 글은 무료로 사용할 수 있는 오픈소스 기반 프로젝트 문서, 버전, 지식 관리 도구들을 조사하고, 이를 간략히 나눔한다. 일부는 github에 공개되어 있어, 이를 잘 이용하면, 프로젝트 작업 프로세스에 통합 등을 할 수 있다.

프로젝트 문서 관리 도구 예시

웹 기반 파일 폴더 관리 도구
이 도구는 MIT라이센스에 따라 출시된 파일 관리자이다. 드래그앤드롭을 지원하며, AWS S3, 위지윅 편집기, 웹 기반 UI 지원한다. 

이 도구는 파일 관리 UI를 제공해, 파일 업로드, 삭제, 미리보기, 이름변경 및 편집을 지원하다. 독립 실행형 앱으로 사용할 수 있다.
이 도구는 SFTP, FTP, S3, GIT, LDAP, MYSQL등 지원하는 웹 파일 관리자이다. 이 도구는 인증, 공유, 미디어 재생 등을 지원한다. 모바일 친화적이고, 플러그인으로 확장이 가능하다.
웹용 파일 관리자이다. 직접 웹사이트 개발이 가능하다. 리눅스, 윈도우, 맥을 지원하고, 로컬 혹은 온라인 실행 가능하다. PHP5로 개발되었다.

서버 모든 폴더를 관리할 수 있는 웹 기반 PHP 파일 관리자이다. 웹 브라우저 기반 파일, 폴더 저장, 업로드 및 관리할 수 있다. PHP 5.5+ 로 개발되었다. 
React 기반 웹 브라우저 파일 관리 도구이다. 드래그앤드롭, 미리보기, 그리드 파일 보기 등을 지원한다. 
이 도구는 파일, 폴더를 관리하는 호스팅 웹 도구이다. 이 도구는 관리자, 사용자에게 개별 접근 권한, 역할을 부여할 수 있다. 대용량 파일 업로드를 지원한다.
이 도구는 Flask 서버를 사용해 WiFi, Internet 기반 파일 탐색 도구이다. 컴퓨터 전체 폴더를 탐색하고, 모든 파일을 다운로드 할 수 있다. 브라우저에서 비디오, 오디오 파일을 스트리밍할 수 있다.

문서 관리 시스템
파이썬 기반 Django를 사용해 개발된 문서 관리 시스템이다. 이 도구는 인텔, 대학 등 많은 기업에서 사용된다. 문서 워크플로 정의 기능을 지원한다.
이 도구는 클라우드 파일 공유 도구로, 멀티 플랫폼을 지원하며, 모바일도 지원한다. 백업, 복구 옵션이 있으며, 클라이언트 간 파일 동기화, 파일 잠금, 로깅, 암호화 등을 지원한다. 라즈베리파이에 설치 가능하다. 

NextCloud
이 도구는 모듈식으로 개발된 클라우드 파일 공유 도구로 GDPR를 준수하며, DICOM(Medical Imaging) 뷰어 앱을 제공한다. 이런 이유로, 의료 분야에 많이 사용된다. 이 도구로 부터 OwnCloud가 파생 개발되었다. 

실시간 협업, 버전 관리, 사용자 접근 관리, 문서 미리보기 및 승인, 워크플로 지원, 검색 등을 지원한다. 

자체 호스팅 지원하는 문서 관리 도구로, PHP로 개발되었고, 설치가 쉽다. 

Java로 개발된 도구이며, 기업용 오픈 소스 문서 관리 시스템이다. 

자체 호스팅을 지원하는 문서 관리 도구로, PHP로 개발되었다. MySQL을 사용하며, 파일 검토, 알림, 만료, 로깅, 리비전 기록 등을 지원한다. 메타 데이터 검색을 지원한다. 

버전 및 형상관리 
이 도구는 소스 분산 버전 관리 도구이다. 로컬 분기, 스테이징, 워크플로 등을 지원한다. 

소스 형상 관리 도구로 널리 사용되고 있다. 파일 및 문서 기록을 남기 있고, 여러 개발자가 동시 개발이 가능하다. 

멀티 플랫폼 지원하는 형상 관리 도구이다. 가볍고, 파이썬 애드온 등을 지원한다.

크로스 플랫폼을 지원하며, 부분 체크인, 아웃을 제공한다. 중앙 서버 유무에 관계없이 사용할수 있다.


지식 관리 도구
OpenKM은 스캔 이미지를 포함한 전자 문서를 저장, 추적, 관리 지원하는 지식관리 시스템이다. 대량 업로드, 오피스 추가 기능 등을 제공한다.
이 도구는 내외부 문서를 중앙 집중화하여, 정보를 검색하고, 문서에 레이블을 지정해 분류하는 데 도움을 준다.
이 도구는 팀, 지식을 연결하는 기능을 제공한다. 프로젝트 협업 시 유용한 기능을 제공한다.
이 도구는 고객의 질문, 답변을 관리해 지식 창고를 구축할 수 있는 기능을 제공한다. 

다음은 각 도구의 장단점을 보여준다.

쉐어포인트 대용 오픈소스 도구
이 도구는 사용자화 가능한 프로젝트 협업 메뉴를 제공한다. 쉐어포인트와 유사하게 동작하며, 문서 기반 협업이 용이하다. 워크플로, 아이디어 교환 등 기능을 제공한다.

이 도구는 Atlassian에서 개발한 협업 도구로, 중앙화된 작업 공간, 팀 작업 지원, 지식관리, 프로젝트 협업 등을 지원한다. 

이 도구는 메시징 기반 프로젝트 협업 도구로, 커뮤니케이션, 보이스 및 비디오 콜, 파일 공유, 작업 추적 등을 지원한다.

Jostle
이 도구는 인트라넷 서비스를 제공하여, 단순한 UI, 일정 공유, 파일 공유, 팀 협업, 조직도, 비디오 콜 등을 제공한다. 
전략 계획, 프로젝트 관리, 협업을 지원하는 도구로, KPI 추적, 리포트 생성, BSC 관리 등을 제공한다. 
이 도구는 프로젝트 관리, 비용 관리, 작업 추적 등을 지원한다. 

Classubes
이 도구는 세어포인트와 유사 기능을 제공하여, 문서 관리, 인트라넷, 일정 관리, 협업 등을 제공한다. 
이 도구는 협업 기능을 제공하며, 문서 기반 관리를 제공한다. 파일 공유, 작업 관리, 사용자화가 가능하다.

마무리
이외 다음과 같은 오픈소스 기반 문서 관리 도구가 있으니, 참고하기를 바란다. 
레퍼런스

오픈소스 기반 프로젝트 관리 및 공통 데이터 개발 환경 도구 소개

이 글은 오픈소스 기반 프로젝트 관리 및 공통 데이터 개발 환경 도구를 소개한다.


레퍼런스

2024년 3월 11일 월요일

유용한 Django GUI 라이브러리 소개

이 글은 유용한 Django GUI 라이브러리를 소개하는 글이다. 
장고는 파이썬 기반 웹 앱 개발 지원 프레임웍으로 매우 강력한 기능을 지원한다. 이 글은 장고 기반 웹 앱 개발 시 사용할 수 있는 유용한 GUI 라이브러리를 살펴본다. 

이 도구는 웹 기반 차트 등 생성을 제공한다. 다양한 데이터소스를 제공해, 이를 사전 정의된 테마, 다양한 차트를 통해 웹에 렌더링할 수 있다.

150개 이상의 반응형 그래프, 차트를 지원하는 이 도구는 대화형 방식의 GUI를 제공한다. MySQL 서버에서 가져온 데이터를 이용해 즉각적인 차트를 생성한다. 사용자 입력에 대한 이벤트를 지원하고, 실시간으로 차트를 추가할 수 있다. 
간트 차트 등 그래프 생성을 지원한다. 이 도구는 매우 다양한 차트를 제공하는 highcharts를 기반으로 개발되었다. 
이 도구는 타임 시리즈 데이터를 데쉬보드로 가시화하는 데 유용하다. 부트스트랩 기반으로 개발되었으며, 다양한 테마를 제공한다. 

기타, 장고에는 DB 객체 맵핑 도구인 ORM, 다중 파일 업로드를 지원하는 ModelForm와 같은 강력한 기능을 기본으로 제공한다. 

레퍼런스

2024년 3월 5일 화요일

UniVision: 시각 중심 3D 인식을 위한 통합 프레임워크

3D 인식 모델은 많은 구조적 및 개념적 유사성을 공유하지만 기능 표현, 데이터 형식 및 목표에는 여전히 격차가 존재하여 통합되고 효율적인 3D 인식 프레임워크 설계에 어려움을 겪고 있다. 

이 기술은 비전 중심 3D 인식의 두 가지 주요 작업인 점유 예측과 객체 감지를 통합하는 간단하고 효율적인 프레임워크인 UniVision을 제시한다. 구체적으로 우리는 보완적인 2D-3D 특징 변환을 위한 명시적-암시적 뷰 변환 모듈을 제안한다. 우리는 효율적이고 적응적인 복셀 및 BEV 특징 추출, 향상 및 상호 작용을 위한 로컬-글로벌 특징 추출 및 융합 모듈을 제안한다.

다중 작업 프레임워크 훈련의 효율성과 안정성을 가능하게 하는 공동 점유 감지 데이터 증대 전략과 점진적인 손실 가중치 조정 전략을 제안한다. nuScenes LiDAR 세분화, nuScenes 감지, OpenOccupancy 및 Occ3D를 포함한 4가지 공개 벤치마크에서 다양한 인식 작업에 대한 광범위한 실험을 수행한다. UniVision은 각 벤치마크에서 각각 1.5mIoU, 1.8NDS, 1.5mIoU, 1.8mIoU 이득으로 최첨단 결과를 달성했다.  


레퍼런스

2024년 2월 27일 화요일

생성AI 기반 코딩 에이전트 개발하기

 이 글은 GitHub Copilot과 같은 생성AI 기반 코딩 에이전트 개발방법을 간단히 정리한다.

CODE LLAMA 개념도

머리말
Code LLAMA는 코드 작업에 특화된 LLAMA2 기반 기술로, 커뮤니티 라이센스로 릴리즈되었다. 코드 라마는 라마2 기반으로 5,000억 토큰 코드 데이터를 학습하였다. 파이썬, 자연어 명령어를 이해할 수 있고, 미세 조정을 통해 성능을 개선했다. 

파이썬, C++, JAVA, PHP. C#, TypeScript, Bash 코드 생성을 지원한다. 7B, 13B 모델을 제공하며, 16k 컨텍스트 길이를 학습하였다. 코드 라마는 위치 임베딩을 을 스케일링할 수 있는 RoPE가 적용되었다. 
코드 학습 예시

라마2를 이용해 인터뷰 프로그래밍 질문 항목을 만들고, 코드 라마를 통해 테스트를 수행해 평가되었다. 

이 글은 다음 개발환경에서 동작되었다. 
  • NVIDIA GPU (Over 28 GB RAM), CUDA 12.1, PyTorch 2.1.2+cu121 (link)
이 글은 학습모델을 최적화하기 위해, 4비트 양자화를 사용해, 크기를 줄인 모델을 사용한다.
4비트 양자화 개념도

코드 라마 사용 방법
4.33 버전부터는 학습 및 추론 예제, 안전한 텐서 포맷(safetensors), 4비트 양자화, 파라메터 미세조정(PEFT), 모델 생성 지원 도우, 배포 등 기능이 트랜스포머 라이브러리에 추가되었다. 다음과 같이 최신 버전을 설치한다.
pip install --upgrade transformers
pip install accelerate peft bitsandbytes transformers trl

다음은 코드 라마 모델을 로딩하고, 트랜스포머 파이프라인을  생성한 후, 기본적인 함수 정의를 생성하는 예제이다. 입력하고 실행해 본다.
from transformers import AutoTokenizer
import transformers
import torch

tokenizer = AutoTokenizer.from_pretrained("codellama/CodeLlama-7b-hf")
pipeline = transformers.pipeline(
    "text-generation",
    model="codellama/CodeLlama-7b-hf",
    torch_dtype=torch.float16,
    device_map="auto",
)

sequences = pipeline(
    'def fibonacci(',
    do_sample=True,
    temperature=0.2,
    top_p=0.9,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
    max_length=100,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")

다음은 그 결과를 보여준다.

이 경우 70억 파라메터를 가진 모델이기 때문에, 최소한 28GB이상 GPU RAM이 필요하다(4바이트일경우 = 7 x 10^9 x 4 bytes. 8바이트일 경우 56GB). 

라마2 미세 조정 방법은 다음 링크를 참고한다. 

마무리
코딩에 대한 생성 AI 모델 테스트는 일반적으로 HumanEval 데이터세트에서 벤치마킹된다. 이 데이터세트는 모델 함수 서명과 스트링이 제공되며, 함수 본문을 작성하는 프로그래밍 과제로 구성된다. 생성된 코드는 미리 정의된 단위 테스트 세트를 실행해 검증한다. 그 결과 얼마나 많은 테스트를 통과했는 지 비율이 리포트된다. 

다음은 그 결과 리더보드 평균 점수를 보여준다. 

레퍼런스

2024년 2월 25일 일요일

오픈소스 LLaVA 기반 ChatGPT 4.0 유사한 멀티모달 생성AI 서비스 만들기

이 글은 ChatGPT 4.0과 같은 LMM(Large langauge Multi-modal Model. 멀티모달 대규모 언어모델)인 LLaVA(Large Language and Vision Assistant. 라바)기반 멀티모달 생성AI 서비스 개발 방법을 나눔한다. 

LLaVA는 Image To Text와 같은 언어-이미지 시각 어시스턴스(Language-Image Visual Assistant)를 지원하기 위해, ViT(Visual Instruction Tuning. 시각적 지시 조정)을 기반으로 개발된 멀티모달 모델 오픈소스이다. 예를 들어, 이미지를 단순히 분류해 주는 것이 아닌, 이미지 내 특정 객체들을 인식하고 관계를 설명할 수 있는 기술을 지원한다.
단독 로컬 서버PC에서 LLaVA 서비스 모습

참고로, ViT는 이미지의 특정 위치에 대한 객체 정보를 인식할 수 있도록 학습하는 기술이다. 예를 들어, GPT-4는 특정 부분의 시각적 특징을 인코딩하기 위해 YOLO모델과 같이 경계 상자를 사용하고, CLIP모델과 같이 해당 부분에 대한 텍스트 임베딩을 입력하여 학습한다(Visual Instruction Tuning).
ViT(Visual Instruction Tuning) 개념

LLaVA의 NeXT버전은 구글 제미나이 프로 성능을 능가했다고 밝혔으며, 이전 버전인 LLaVA 1.5에 비해 이미지 해상도, OCR 기능 등이 개선되었다고 한다. 

LLaVA 아키텍처

이 글은 Ollama를 이용해 LLaVA NeXT를 로컬 PC에서 실행하는 방법을 따라해 본다. 

머리말
LLaVA는 대형 멀티모달 모델으로, GPT-4.0과 유사한 LMM을 개발하고자, 마이크로소프트 연구팀에서 오픈소스로 개발되었다. MS는 LLaVA의 논문, github code, demo site 등을 공개하였다. 
LLaVA LMM(Large language Multi-modal Model)은 비전 인코더, LLM 모델을 기반으로 개발되었으며, Image to Text에서 인상적인 성능을 보여준다. LLaVA는 비전 인코더로 OpenAI에서 공개한 CLIP 모델을 사용했으며, 메타(페이스북)에서 공개한 LLaMA 기반 Vicuna LLM 모델을 사용했다. 학습은 A100 GPU x 8 x 1 Day 와 60만개 데이터셋을 사용했다.

LLaVA를 설치하고, 실행해 보기 위해서는 다음 개발환경이 컴퓨터에 미리 설치되어 있다고 가정한다(Ubuntu, NVIDIA, CUDA등 설치 방법은 앞의 글 참고). 
터미널에서 다음 명령을 실행해 LLAVA모델을 설치한다.  

제대로 설치되면, 다음과 같이 프롬프트 질문과 답변을 얻을 수 있다.
LLaVA모델에게 PyThon 코딩 요청한 모습

개발환경 준비
다음 명령을 터미널에서 실행한다. 
git clone https://github.com/haotian-liu/LLaVA.git
conda create -n venv_lmm python=3.10 -y
conda activate venv_lmm
pip install --upgrade pip
pip install -e .
pip install cog

LLaVA 실행하기
다음 명령을 각 터미널에서 실행한다.
python -m llava.serve.controller --host 0.0.0.0 --port 10000

python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1.6-34b --load-4bit
다운로드된 학습 모델은 다음 폴더에 저장된다(불필요한 모델 파일은 rm -rf 명령으로 삭제할 수 있음).

참고로, 모델 다운로드에 매우 오랜 시간이 걸리므로, 실행해 놓고, 다른 일을 하는 것이 좋다. 

모델 다운로드 후 다음을 실행한다. 그럼 gradio_web_server 웹서버가 실행되고, 해당 주소로 LLaVA UI가 서비스된다. 참고로 Gradio는 머신러닝 파이프라인을 위한 Web App을 빠르게 만들 수 잇는 파이썬 라이브러리이다(참고). 
python -m llava.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload --share

실행되면, 다음과 같이 Gradio 웹 인터페이스가 실행된다. 궁금한 프롬프트를 입력하면, 적절히 잘 대답해준다. 

다음과 같이 적절한 이미지를 입력해 보고, 질문해 본다. 그럼, 그림 내용을 묘사 설명해준다.

LLaVA 모델 에러 처리 방법
실제로 LLaVA 모델을 실행해보면 다양한 에러가 발생할 수 있다. 다음은 시행착오를 정리한 것이다.
 
1. llava.service 에러가 발생하면, OLLAMA를 다음과 같이 설치하고 다시 시도한다. 
curl -fsSL https://ollama.com/install.sh | sh

2. 패키지 설치가 잘못되었을 수 있다. 이 시점에도 LLaVA모델 코드는 계속 수정되고 있는 상황이다. 이런 이유로 패키지 버전 불일치 문제가 발생할 수 있다. 이 경우, 에러를 확인해 하나씩 적절한 패키지 버전을 설치한다. 
pip install llava cog pydantic fastapi gradio protobuf

3. 앞의 내용 실행 중 허깅페이스 CLI 토큰 입력 요청이 있을 수 있다. 이 경우, 아래 링크를 참고해, 토큰을 발급받고, 입력한다. 
Huggingface Token 발급 예시(Hugging Face Access Token)

4. bitsandbytes 에러가 발생할 수 있다.
UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable" warn("The installed version of bitsandbytes was compiled without GPU support. " 'NoneType' object has no attribute 'cadam32bit_grad_fp

이 경우, 다음 링크를 참고해 해결해야 한다.

5. GPU RAM 에러가 발생할 수 있다. 그럼, 좀 더 작은 사이즈 모델(참고)을 다운로드받아 서버를 실행한다.
python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1.5-7b --load-4bit

마무리
ChatGPT-4와 같은 LMM을 LLaVA를 이용해 코드 한 줄 없이 로컬 PC에 설치하고, 서비스를 구현할 수 있다. 실행 결과 LLaVA의 꽤 훌륭한 LMM 성능을 확인할 수 있다.

다만, 아직 특정 전문 분야의 멀티 모달리티 성능은 아직 그리 좋지 못하다. 참고로, MS, Google과 같은 빅테크 기업들은 시장성이 큰 헬스케어 분야에서 대학 병원 등과 협업하여, 이런 격차를 줄이기 위해 노력하고 있어, 조만간 더욱 발전될 것이다.
LLAVA-Med (Microsoft)
LLaVA-Med 학습 예시(헬스케어 분야. Microsoft)

레퍼런스