문득 Ai 프로젝트 하나를 하고 싶다는 생각이 들었다.
사실 처음에 데스크탑을 맞출 때, 4080 super 그래픽카드를 산 것도 Ai 관련 뭔가를 내가 하지 않을까 하는 생각에서였는데 산지 2년도 더 넘은 지금에서야 뭔가를 해보려 한다.
내 목표는 아무래도 반도체 업계에 들어가는 거니까 데이터 분석쪽으로 해서 프로젝트 방향을 잡을 거고, 과정은 다른 산업도 마찬가지겠지만 특히 반도체 산업이 가지는 보안의 중요성 때문에 Local Ai 기술이 중요할 것이란 생각에 GPT나 Gemini같은 대형 LLM이 아닌 구글 젬마와 같은걸 사용해서 온디바이스 Ai 기술을 시도해 볼 것이다.
아직 나도 Ai에 대해 잘 모르기 때문에 앞선 설명이 틀렸을 수도 있고, 하면서 배워갈 생각이다.
여튼 시작해보겠다.
먼저 Terminal에서 내 컴퓨터의 GPU를 확인한다. 명령어는 nvidia-smi

정상적으로 뜬다. 다음은 Linux가 깔려있는지 확인한다. 명령어는 wsl -l -v

깔려있지 않으므로 wsl --install -d Ubuntu 라는 명령어로 설치까지 해 주었다.
설치가 끝나면 default Unix user account 즉, 이름을 정하라고 뜬다. 원하는 이름을 입력하고 (나는 localai 로 정하였다), 비밀번호를 입력해주면 끝이다.

성공하면 이제 localai@DESKTOP-xxxx:~$ 이러한 프롬프트가 나온다. 이때 xxxx는 각자 컴퓨터의 고유한 이름이다.
마지막으로 한 번 더 ubuntu 내에서 nvidia-smi를 입력하면 WSL Ubuntu가 GPU인식하는지 알 수 있다.

이제부터는 Ubuntu에 Python 개발에 필요한 기본 도구들을 설치할 것이다. 각 도구들은
- Python = AI 코드 실행 언어
- pip = Python 패키지 설치 도구
- venv = 프로젝트별 가상환경
- git = 코드/프로젝트 관리 도구
라고 보면 된다.
sudo apt update 를 입력하자 (관리자 권한으로 설치 가능한 우분투 프로그램 목록을 업데이트 하는 것이다) 그런다음 비밀번호를 입력하라고 하는데, 각자가 설정했던 우분투 비밀번호를 입력하면 된다.
업데이트가 끝나면 sudo apt install -y python3-pip python3-venv git build-essential 입력한다. 각각은
- python3-pip Python 패키지 설치 도구
- python3-venv Python 가상환경 생성 도구
- git 코드 관리/다운로드 도구
- build-essential 일부 패키지 설치에 필요한 컴파일 도구
를 의미한다.
다음으로 각각의 명령어를 한 줄 씩 입력한다.
cd ~
mkdir local-semicon-ai
cd local-semicon-ai
뜻은
- cd ~ 내 Ubuntu 홈 폴더로 이동
- mkdir local-semicon-ai 프로젝트 폴더 생성
- cd local-semicon-ai 그 폴더 안으로 이동
이다.
이제는 프로젝트 전용 파이썬 작업공간을 .venv라는 형식으로 만들 것이다. python3 -m venv .venv 를 입력한다.
그런다음 가상환경을 켤 것이다. source .venv/bin/activate 라는 명령어를 입력해보자. 앞에 (.venv) 가 보이면 성공이다.

이제 pip 업데이트를 한다. 파이썬 패키지 설치 도구를 최신으로 올리는 과정이다. pip install --upgrade pip
이제 그 유명한 PyTorch를 설치할 것이다.
(.venv)가 켜진 상태에서 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 를 입력한다.
설치하는데 시간이 좀 걸린다. 설치가 끝나면 python -c "import torch; print('torch:', torch.__version__); print('cuda available:', torch.cuda.is_available()); print('gpu:', torch.cuda.get_device_name(0)); print('pytorch cuda:', torch.version.cuda)"
를 입력해서 CUDA/GPU 사용가능 여부를 체크한다.

이제 본격적인 프로젝트를 위한 QLoRA 관련 라이브러리를 설치해야 한다. pip install -U transformers datasets accelerate peft trl bitsandbytes sentencepiece protobuf huggingface_hub
를 입력한다. 이것 또한 시간이 조금 걸린다. 명령어의 뜻은
- transformers Hugging Face 모델 불러오는 핵심 라이브러리
- datasets 학습 데이터셋 불러오기/처리
- accelerate GPU 학습 보조 도구
- peft LoRA/QLoRA 학습용 라이브러리
- trl LLM instruction tuning에 자주 쓰는 학습 도구
- bitsandbytes 4bit 양자화에 필요
- sentencepiece tokenizer 관련 도구
- protobuf 모델/토크나이저 파일 처리에 필요
- huggingface_hub Hugging Face 로그인/모델 다운로드 도구
이다. 설치가 끝나면 정상적으로 설치됐는지 확인한다. python -c "import transformers, datasets, accelerate, peft, trl, bitsandbytes; print('all qlora packages imported successfully')"

이제 젬마를 설치하러 가자. 그 전에 hugging face 가입을 해둬야 한다. 가입이 되었다면

본인 컴퓨터 사양에 맞는 모델을 찾는다. 나는 gemma-4-E4B-it를 사용할 것이다.
여기서 Files를 눌러서 파일 목록이 정상적으로 보이면 알맞게 찾아온 것이다.
여기서 뭘 할건 아니고, 이제 Access Token을 만들어야 한다. 프로필 settings에 들어가서 Access Tokens를 찾는다.
토큰 생성을 누르고 토큰 이름을 정한다. 그리고

Read 선택한다. 바로 토큰 값이 뜨는데 이때 copy 해두고 안전한데 저장해둔다. 이후로는 보안 때문에 토큰값을 불러올 수 없다.정상적으로 생성된후 Value 에 hf_xxxxxxxxxxxxxxxxx 가 표시되는걸 볼 수 있다. 이건 토큰의 비밀번호 같은 역할이라 유출되지 않도록 주의한다.
이제 Ubuntu 로 돌아가 hf auth login 를 입력한다. 그러면 브라우져로 로그인할건지 토큰값으로 로그인할건지 물어보는데, 토큰값으로 로그인을 눌러 아까 복사해뒀던 토큰값을 입력하자.

정상적으로 로그인 되었다. hf auth whoami 입력해서 정상적으로 되었는지 확인한다. 정상적이라면 본인의 허깅페이스 유저 ID가 뜰 것이다.
이제 Gemma를 내 PC에 로딩할 수 있는지 확인한다. 먼저 mkdir -p scripts 로 폴더를 하나 생성하고, 다음 명령어를 입력한다.
cat > scripts/test_load_gemma4.py <<'PY'
import torch
from transformers import AutoProcessor, AutoModelForCausalLM, BitsAndBytesConfig
MODEL_ID = "google/gemma-4-E4B-it"
print("CUDA available:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU")
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
print("Loading processor...")
processor = AutoProcessor.from_pretrained(MODEL_ID)
print("Loading model in 4bit...")
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
quantization_config=quantization_config,
device_map="auto",
torch_dtype=torch.bfloat16,
)
print("Model loaded successfully.")
prompt = "PVD 공정에서 step coverage가 나빠지는 이유를 3문장으로 설명해줘."
messages = [
{"role": "user", "content": prompt}
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt",
).to(model.device)
print("Generating...")
with torch.no_grad():
outputs = model.generate(
inputs,
max_new_tokens=200,
do_sample=False,
)
response = processor.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True)
print("\n===== MODEL RESPONSE =====")
print(response)
PY
그런 다음 아래 명령어를 입력해 테스트 코드를 실행한다.
python scripts/test_load_gemma4.py
처음 실행할 때는 Hugging Face에서 Gemma 4 E4B-it 모델 파일을 직접 다운로드하기 때문에 시간이 조금 오래 걸릴 수 있다. 한 번 다운로드된 모델은 캐시 폴더에 저장되므로, 이후 실행부터는 처음보다 빠르게 진행된다.
이번에 작성한 코드는 Gemma 4 E4B-it 모델을 4bit 양자화 상태로 내 GPU(RTX 4080 SUPER)에 올리고, 간단한 반도체 공정 질문에 대해 답변을 생성할 수 있는지 확인하는 테스트 코드이다.
아직 QLoRA 학습을 진행한 것은 아니다. 본격적인 학습 전에 모델이 정상적으로 불러와지는지, GPU를 제대로 사용하는지, 기본적인 추론이 가능한지를 확인하는 단계라고 보면 된다.
먼저 scripts 폴더를 만들었다. 앞으로 Python 실행 파일은 이 폴더 안에 정리할 예정이다.
local-semicon-ai/
└─ scripts/
└─ test_load_gemma4.py
코드의 첫 부분에서는 필요한 라이브러리를 불러온다.
import torch from transformers import AutoProcessor, AutoModelForCausalLM, BitsAndBytesConfig
torch는 GPU 연산과 딥러닝 모델 실행에 사용된다. transformers는 Hugging Face 모델을 불러오기 위한 라이브러리이다. AutoProcessor는 입력 문장을 모델이 이해할 수 있는 형식으로 바꿔주고
AutoModelForCausalLM은 텍스트 생성 모델을 불러오는 역할을 한다.
BitsAndBytesConfig는 4bit 양자화 설정을 적용하기 위해 사용했다.
다음으로 사용할 모델을 지정했다.
MODEL_ID = "google/gemma-4-E4B-it"
이 모델은 Hugging Face에 올라와 있는 Google Gemma 4 계열 모델이다. 이번 프로젝트에서는 이 모델을 로컬 환경에서 불러와 반도체 공정 관련 질문에 답변할 수 있는지 확인했다.
그다음 CUDA와 GPU가 정상적으로 잡히는지 확인했다.
print("CUDA available:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU")
여기서 CUDA available 값이 True로 나오면 PyTorch가 GPU를 사용할 수 있다는 뜻이다. GPU 이름으로 RTX 4080 SUPER가 출력되면 정상적으로 인식된 것이다.
이후 4bit 양자화 설정을 적용했다.
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
4bit 양자화는 모델을 더 적은 메모리로 불러오기 위한 방법이다. LLM은 파라미터 수가 많기 때문에 원본 상태로 불러오면 VRAM을 많이 사용한다. 따라서 개인 GPU 환경에서는 4bit 양자화를 적용해 메모리 부담을 줄이는 것이 중요하다.
이 설정을 통해 모델 본체는 4bit로 압축해서 불러오고, 계산에는 bfloat16을 사용하도록 했다. QLoRA에서도 이와 비슷하게 4bit로 양자화된 모델 위에 LoRA adapter를 붙여 학습한다.
다음으로 processor를 불러왔다.
processor = AutoProcessor.from_pretrained(MODEL_ID)
processor는 사람이 입력한 문장을 모델이 이해할 수 있는 token 형태로 바꿔주는 역할을 한다. 쉽게 말해, 사용자의 질문을 Gemma 모델에 맞는 입력 형식으로 변환해주는 도구이다.
그다음 실제 모델을 불러왔다.
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
quantization_config=quantization_config,
device_map="auto",
torch_dtype=torch.bfloat16,
)
여기서 Hugging Face에 있는 모델 파일을 다운로드하고, 앞에서 설정한 4bit 양자화 방식으로 모델을 로딩한다. device_map="auto"는 모델을 어느 장치에 올릴지 자동으로 정하라는 뜻이다. GPU가 정상적으로 잡혀 있다면 가능한 범위에서 GPU에 모델이 올라간다.
모델 로딩이 끝나면 간단한 테스트 질문을 넣었다.
prompt = "PVD 공정에서 step coverage가 나빠지는 이유를 3문장으로 설명해줘."
모델이 반도체 공정 용어를 이해하고 답변을 생성할 수 있는지 확인하기 위한 간단한 테스트용 질문이다.
그다음 질문을 chat 형식으로 만들었다.
messages = [
{"role": "user", "content": prompt}
]
요즘 LLM은 단순한 문장 입력보다 user와 assistant로 구분된 대화 형식을 사용하는 경우가 많다. 여기서는 사용자의 질문만 넣고, 모델이 assistant 역할로 답변을 생성하도록 했다.
이후 processor.apply_chat_template을 사용해 질문을 모델 입력 형식으로 변환했다.
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt",
).to(model.device)
이 부분은 사용자의 질문을 Gemma 모델이 요구하는 chat template에 맞게 바꾸고, token으로 변환한 뒤, 모델이 올라간 장치로 보내는 과정이다.
마지막으로 모델이 답변을 생성하도록 했다.
with torch.no_grad():
outputs = model.generate(
inputs,
max_new_tokens=200,
do_sample=False,
)
torch.no_grad()는 학습이 아니라 추론만 할 때 사용하는 설정이다. gradient 계산을 하지 않기 때문에 메모리를 아낄 수 있다. max_new_tokens=200은 최대 200토큰까지 답변을 생성하라는 의미이고, do_sample=False는 랜덤성을 줄여 비교적 안정적인 답변을 생성하도록 하는 설정이다.
생성된 출력은 다시 사람이 읽을 수 있는 문장으로 변환했다.
response = processor.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True)
모델의 출력은 처음에는 token 형태이기 때문에 decode 과정을 거쳐 자연어 문장으로 바꿔야 한다. 입력 질문 부분은 제외하고, 모델이 새로 생성한 답변만 출력하도록 했다.
이번 테스트는 QLoRA 학습 전에 진행한 모델 로딩 확인 단계이다. 이 단계에서 확인한 것은 크게 세 가지이다.
- WSL2 Ubuntu 환경에서 GPU가 정상적으로 잡히는지 확인했다.
- Gemma 4 E4B-it 모델을 4bit 양자화로 불러올 수 있는지 확인했다.
- 간단한 반도체 공정 질문에 대해 모델이 답변을 생성하는지 확인했다.
이 과정이 성공하면 다음 단계에서는 반도체 공정 질문-답변 데이터셋을 만들고, QLoRA를 통해 모델이 공정 엔지니어형 답변 구조를 더 잘 따르도록 학습시키는 실험을 진행할 수 있다.


'Engineering Log (실습 및 프로젝트) > Local AI Project' 카테고리의 다른 글
| Local AI Project 세 번째 이야기 - QLoRA 학습을 위한 반도체 공정 답변 데이터셋 만들기 (1) | 2026.07.13 |
|---|---|
| Local AI Project 두 번째 이야기 - Gemma 4의 기본 답변을 저장하고 비교 기준 만들기 (0) | 2026.07.03 |