클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

허깅페이스 5 - 파인 튜닝 모델 사용해보기 2 : 콩잎 모델 직접 만들고 사용해보는 실습 본문

인공지능/머신러닝

허깅페이스 5 - 파인 튜닝 모델 사용해보기 2 : 콩잎 모델 직접 만들고 사용해보는 실습

huenuri 2024. 9. 15. 08:37

이어서 파인 튜닝 모델의 다음 과정을 실습해보겠다. 빠르면 30분에서 1시간이면 이 내용을 학습 완료할 수 있을 것 같다. 바로 학습을 진행해보겠다.


 
 
 
 

파인 튜닝 모델로 콩잎 데이터 분석하기 두번째 실습

 

1. 학습 및 검증 확인하기

 
이미지 데이터를 다룰 때 배치(batch) 단위로 나누어 처리하는 방식이 중요한데, 그 과정을 돕는 함수(collate_fn)이다. 
 

  • 배치(batch)는 여러 데이터를 묶어서 한 번에 처리하는 단위이다. 예를 들어, 학습할 공용 데이터가 1000장이 있다면, 한 번에 모두 처리하기에는 메모리나 자원의 한계가 있을 수 있다. 그래서 데이터를 적당한 크기로 나누어 처리하는데, 이때 사용되는 단위가 배치이다.
  • 배치 단위로 데이터를 묶어서 학습하면 메모리와 계산 자원을 효율적으로 사용할 수 있다.

즉 이 함수는 배치 단위로 데이터를 묶어주는 역할을 한다. 이 과정은 이미지 학습 모델을 훈련시킬 때 데이터를 한 번에 효율적으로 처리하기 위해 사용한다.


 
 
 

 
사실 선생님이 수업 시간에 소개한 코드가 있었는데 이걸 실행하니 계속 오류가 뜨고 안 되는 것이다. 오류의 원인은 datasets 패키지에서 load_metric을 사용할 수 없는 상황 때문이다. 이 문제는 최근에 라이브러리의 버전 문제라고 하는데, datasets 모듈에서 메트릭을 다루는 부분이 evaluate라는 별도의 라이브러리로 분리되었다고 한다.
evaluate 라이브러리를 설치하고, load_metric 대신 evaluate를 사용하는 방법으로 문제를 해결했다.
 
 
 

 
기존 버전에서 업데이트도 진행해보았다. 수업 시간에는 이런 건 설명해주시지 않았다.


 
 

2. 사전 학습된 모델 가져오기

 
사전 학습된 모델(Pretrained Model)을 불러와서 이미지 분류 작업을 수행하려는 과정이다. 여기에선 Vision Transformer (ViT) 모델을 사용해서 이미지 분류를 위한 세팅을 하고 있다. 자세한 설명은 생략한다. 어차피 지금은 무슨 말인지 하나도 모를테니까.
라벨을 가져와서 모델을 준비한다. 사전 학습된 모델을 불러오는데 이 모델은 이미지넷 데이터셋으로 사전 학습되었다. 그런 다음 클래스 이름을 인덱스에 매핑한다. 즉 사전 학습된 ViT 모델을 이미지 분류에 사용할 수 있도록 준비하고, 추가 학습을 통해서 더 나은 성능을 내기 위한 세팅을 하는 것이다.


 
 
 

 
이제 transformers 라이브러리의 TrainingArguments 클래스를 사용해서 모델 학습 시에 필요한 파라미터들을 설정한다. 학습 과정에서 어떤 방식으로 모델을 훈련할지, 평가할지, 그리고 결과를 저장할지를 지정하는 중요한 단계이다.
코드 마지막에 있는 FutureWarning은 evaluation_strategy가 나중 버전에서 제거될 예정이라는 경고이다. 해당 경고는 성능에 영향을 주지는 않으니, 신경 쓰지 않아도 된다.


 
 
 

3. 학습 시키기

 
transformers 라이브러리의 Trainer 클래스를 사용하여 모델을 학습시키는 부분이다. Trainer는 Hugging Face에서 제공하는 강력한 훈련 도구로, 학습을 더 간단하게 구성할 수 있도록 도와준다.
코드 아래에 있는 경고 메시지는 torch.cuda.amp.GradScaler가 향후 버전에서 더 이상 지원되지 않을 것이라는 경고이다. 향후 버전에서는 다른 방법으로 변경해야 할 거라는 내용이라고 한다.
전체적으로 모델 학습을 위해 준비된 설정들과 데이터들을 모아서 Trainer 클래스로 훈련을 시작하는 부분이다.


 
 
 

 
모델 학습의 최종 결과를 출력하고, 학습된 모델과 그 결과를 저장하는 부분이다. 모델을 학습시키고 저장해서 학습 결과에서 나온 성능 지표들을 로깅한다. 그런 다음 학습 결과를 출력하는 것이다.
모델이 성공적으로 학습되었고, 높은 정확도를 보여주는 상태이다. 모든 학습 지표와 모델은 저장되어 나중에 재사용하거나 성능을 평가할 수 있도록 파일로 저장된 상황이라고 할 수 있다.
 


 
 
 
 

4. 학습 결과 예측 및 평가해보기

 
학습된 모델을 테스트 데이터에 대해 평가하고, 그 결과를 로그 및 저장하는 과정이다. 여기서 테스트 데이터로 모델이 얼마나 잘 예측하는지를 확인하고 있다.
모델이 테스트 데이터셋에 대해 96.88%의 정확도를 기록했으며, 손실값도 낮게 나타나 모델이 테스트 데이터셋에 대해 잘 예측하고 있는 상태이다.


 
 
 

5. 우리가 만든 모델 허깅페이스에 업로드하기

 
Hugging Face의 Hub에 로그인하고, 그 이후에 자신이 만든 모델을 업로드할 수 있도록 준비하는 단계이다. 이를 통해 Hugging Face의 저장소에 모델을 업로드하고 다른 사람들과 공유할 수 있다.
여기서 login() 함수를 호출하면 토큰을 입력해 계정에 인증을 진행할 수 있다. 인증이 완료되면 "Login successful" 메시지가 나타나고, 모델 업로드 준비가 끝난다. 그런 다음 이 토큰을 사용해 Hugging Face 저장소에 데이터를 쓸 수 있는 권한을 받는다. 실행이 왼료되면 모델을 업로드할 수 있음을 나타낸다.


 

허깅페이스에 모델을 업로드하는 방법

 

  1. Hugging Face 토큰 생성
    • Hugging Face 홈페이지에 로그인하고, 설정 페이지에서 새로운 API 토큰을 생성한다.
    • 토큰은 Settings -> Access Tokens에서 만들 수 있다.

 
  2. 토큰을 이용해 로그인

  • 위 코드처럼 huggingface_hub.login() 명령어로 로그인하는데, 실행하면 토큰을 입력할 수 있는 창이 뜨거나 직접 문자열로 토큰을 넣어 로그인을 완료한다.

  3. 모델 저장 및 업로드

  • 학습이 끝난 모델을 Hugging Face에 업로드하려면, Trainer 또는 Hugging Face API를 사용해 모델을 업로드할 수 있다.

 
이렇게 토큰을 만들라는 창이 뜬다. 난 이미 토큰을 만들어서 이 작업은 하지 않았다. 그리고 수업 영상이 없어서 자세한 건 잘 모르겠다. 나중에 필요하게 된면 그때 찾아보면서 다시 공부하면 될 것 같다.
하는 방법을 알았다. 토큰을 생성하면 어떤 코드가 생기는데 그걸 붙여넣으면 된다.


 
 
 

6. 정보 입력하고 모델 등록하기

 
Hugging Face Hub에 모델을 업로드할 때, 그 모델과 관련된 추가적인 메타데이터를 함께 제공하는 부분이다. 이러한 정보들은 모델의 사용성과 이해도를 높이기 위해 Hugging Face Hub에 업로드할 때 함께 제공되는 메타데이터이다. 이 메타데이터를 통해 모델의 배경 정보, 사용된 데이터셋, 태그 등을 명확하게 표시할 수 있다.


 

 

 
허깅페이스를 로그인하면 밑에 이름이 뜨는데 그 내용을 쓰면 된다. 이 코드 실행 결과는 trainer.push_to_hub 메서드를 사용하여 Hugging Face Hub에 모델을 업로드한 결과이다. 이제 Hugging Face Hub에서 모델을 사용할 수 있게 되었으며, 해당 URL을 통해 저장소에서 직접 확인하고 모델을 배포하거나 다른 프로젝트에서 사용할 수 있다.


 
 
 

7. 내 모델 가져와서 사용하기

 
이제 내 모델을 가져와서 사용할 수 있게 되었다. 뒤에 코드는 내가 만든 모델명을 복사해서 붙여넣으면 된다. 모델을 허깅페이스에 등록해놓으면 이미 내 모델이 있기 때문에 또 다시 학습할 필요가 없다는 장점이 있다.


 
 
 

8. 콩잎 이미지 가져와서 예측하기

 
이제 이미지와 텍스트를 가져와서 예측하도록 만들어준다. 이 url은 인터넷에서 불러온 이미지이다. 해당 이미지를 모델에 입력하여 사용한다. 예측 결과  99%의 확률로 'bean_rust' 질병과 가장 관련이 있다고 판단했다. 하지만 다른 클래스(‘healthy’ 및 'angular_leaf_spot')에 대한 확률도 계산되었으며, 'healthy'에 대한 확률이 두 번째로 높다.
 
 

 
또 다른 콩잎을 가져와서 예측해보았다.
 

 
 
 
하나는 건강한 것과 하나는 모자이크 병에 걸린 것으로 가져왔는데 잘 예측을 했다. 우리는 이 모델을 통해 사용자에게 콩잎을 입력받은 후 예측할 수 있게 된 것이다.
그리고 콩잎 데이터 값을 변수에 넣고 사용자가 출력을 받을 수 있도록 여기에 인덱스와 라벨 이름을 넣어준다.
 

 
이제 콩잎의 상태가 제대로 출력되고 있다.
 


 
 
 

학습을 마치고

1시간 정도에 걸쳐 이 부분을 학습해보았다. 내가 목표했던대로 달성해서 정말 기쁘다. 마지막 끝 부분에는 이전에 작성하지 않은 코드도 있어서 작성해보았다. 그리고 수업을 들을 때는 거의 이해하지 못했던 내용인데 복습을 통해 대부분 이해할 수 있어서 정말 신기했다.
이제 아침에 남은 시간 동안은 플라스크 공부를 하려고 한다. 허깅페이스에 직접 토큰도 만들어보고 올린 모델을 사용해보는 좋은 경험이었다.