머신러닝AI2024. 9. 14. 11:26

 딥러닝이라는 개념이 각광받는 가운데, 단지 마케팅 용어로 딥러닝을 접하고, 피상적으로만 알고 있는 사람들이 꽤 많다. 정작 이 분야를 잘 알아야 하는 사람들도 그렇다. 예를 들어 흔히 듣는 이야기는 단순한 통계모델로 하면 될 문제를 '딥러닝'으로 풀겠다고 이야기한다는 점이다. 딥러닝이 성능이 좋다는 말이 널리 퍼지면서, 앞뒤의 맥락없이 그렇게 접근되기 때문이다. 아쉬움 가득한 상황이다. 그래서 오늘은 이 이야기를 간단히 해보자.

 

 딥러닝은 어찌보면 연결주의자들의 꿈이었다. 사람들은 오랫동안 기호주의에 의거해 AI 문제를 해결하려고 했다. 즉 if-then의 끊임없는 나열이나, 어떤 단순한 통계 모델을 조합해서 완전하게 설명가능한 AI를 만드는 것이다. 직접 코딩을 통해 프로그래밍을 한다고 생각해보면 쉽게 이해할 수 있다. 우리가 하는 대부분의 환원주의적인 과학 접근 방식을 닮은 접근이다. 모든 것을 잘게 분할해서 부품을 잘 만든 후 합쳐서 완성품을 만드는 형식이다. 로보트를 그렇게 만들지 않는가. 팔을 연구하고, 다리를 연구하고, 각각을 연구해서 모두 붙인다. 그것이 기호주의가 따르는 방식이다.

 

 그런데 연결주의는 좀 다르다. 최초의 인공 신경망은 이미 1943년(Warren McCulloch, Walter Pitss) 부터 다루어져왔는데, 그저 입력값들에 배정된 가중치를 곱해서, 어느 정도 이상의 합 결과가 나오면 발화된다는 단순한 구조의 반복이다. 신경해부학자들은 말도 안된다며 펄쩍 뛴다고 하지만, 우리네 신경세포를 조금은 닮았다. 인공 뉴런을 계속 병렬로 나열하면 여러가지 입력을 다룰 수 있고, 여러 층을 만들면, 2차원의 신경망이 펼쳐지게 된다. 매우 똑같은 역할을 하는 인공신경 여러개를 연결해서 망을 이루고, 이것을 늘려나가면 복잡한 문제를 풀 수 있을 것이라는 것이 이 인공 신경망의 기대였다. 이미 1950년대에 그런 믿음이 주장될 정도로 이 인공신경망에 대한 기대는 컸다.

 

 얼마나 매력적인가. 복잡한 것을 설계할 필요가 없다. 뉴런을 그냥 늘리고, 신경망 가중치만 적절히 조절해주면 그 복잡한 구조 속에서 복잡한 일을 해내게 될것이다. 물론 아쉽게도(?) 어려운 점이 없는 것은 아니다. 바로 그 모든 노드들의 가중치를 정하는 문제이다. 우리는 이것을 '학습'이라고 이야기한다. 데이터를 통해 이 가중치를 적절한 방식으로 조절해주어야만 신경망은 제 역할을 할 수가 있다. 

 

 그런데 이 신경망의 어려움은, 신경망을 얼마나 복잡하게 만들어야 할지, 또한 복잡할수록 이 가중치값이 많아져서, 어떻게 조절을 해야 제대로된 출력을 낼지 알기 어렵다는 사실이다. 그래서 한참 이 신경망은 여러가지 개선 이론에도 불구하고 인기가 떨어졌다. 1969년 마빈 민스키 등이 간단한 신경망에서, 기존의 일반적인 방법으로 풀지 못하는 상황이 있다는 것이 초기 유명한 증명 사례다(XOR문제). 그리고 MLP(다층퍼셉트론-다층신경망)에 대한 학습 해법인  back propagation이 1974년 최초로 박사학위 논문에 등장하고(Paul Werbos), 그 유명한 힌튼 교수도 유사한 방식을 주장하면서(1986년, Geoffrey Hinton) 1980년대에 다시 한번 기대를 받게 된다.

 

 하지만 역시나 신경망이 커지면 이 방법마저도 그다지 효과적이지 않고, 최적값에 수렴하지 못하는 경우가 많다는 것은 역시 단점이었다. 그래서 더 확실히 최적화 가능한, 수학적으로 더 우아한 SVM(2000년 전후까지 강세였던) 같은 방법에 밀려버렸고 2006년경까지 신경망은 그저 연결주의자들의 예측하기 어려운 변덕적인 방법으로 취급받아왔다. 학습할때마다 결과가 다르고, 잘 학습도 안되는 모델일 뿐이었다. 그래서 논문을 제출해도 잘 받아주지도 않았다. 그 시기가 바로 인공신경망의 가장 혹독한 겨울이었다. 연결주의의 암울한 시기이다.

 

 그러다가 이 연결주의(신경망)를 포기하지 않았던 Hinton교수 랩을 중심으로 다양한 방법론이 등장하게 되었다. 초기 신경망의 가중치를 전략적으로 잘 설정하면 된다던가, Auto Encoder라는 방법으로 한층한층 학습을 시킨다던가, 가중치를 합해서 발화를 판별했던 그 활성화 함수를 바꾼다던가(ReLU), 노드들을 일부분 생략하고 학습을 해서 좀더 넓게 학습 결과가 퍼져나가게 하는등(Dropout) 다양한 전략이 소개되었다. 그러면서 전보다 훨씬 더 효율적이 더 큰 신경망을 학습시킬 수 있음을 알게되었다. 이때 바로 소위 논문 accept가 잘 되기 위해서 이 신경망에 deep belief net, deep networks 라는 이름을 붙이기 시작했고, 이것이 딥러닝의 기원이 되었다. 그래서 흔히 사람들이 지칭할때, 좀더 계층도 많고 입력도 많은 신경망을 이제 '딥러닝'이라고 부른다고 표현한다.

 

" A fast learning algorithm for deep belief nets, 2006년 제프리 힌튼"

" Greedy layer-wise training of deep networks, 2007년 요수아 벤지오"

 

 여하튼 그래서 deep learning이란 큰 신경망이나 깊은 신경망(2차원이니까 입력을 늘릴 수도 있고 층을 늘릴 수도 있으니, 이 경우는 층을 늘리는 의미가 좀더 있겠다. 깊은 층을 만드는 일이다)을 의미한다고 보면 된다. 그러면 얼마나 커야 할까?

 

 이제 2010년이 넘었고, CNN(Convolutional Neural Networks)이 각광받던 시기가 되었다. 사실 저렇게 큰 신경망에 대해서 연구를 했다고 하지만 아직 컴퓨팅 한계 때문에 큰 신경망을 실험하기가 어려웠다. CNN자체는 1998년도에도 논의되었으나 세간에 제대로 히트를 친 것은 2012년이다. Hinton제자중에 Alex와 Sutskever가 게임에나 쓰던 병렬 소수점 연산 프로세서인 GPU를 사용해(Alex의 작품이다) 이미지 인식 대회에서 큰 성능 향상을 이뤄낸다. 바로 AlexNet(2012년)의 탄생이다. CNN과 큰 신경망을 제대로 구현해서 제 시간 안에(?) 학습을 시킨 셈이다. 6천만개 파라메터를 사용했다고 한다. 그정도만 되어도 연산량이 어마어마하다. 그래서 딥러닝이란 이제 큰 신경망 + GPU + 많은 수의 데이터라는 공식이 성립되게 된 셈이다. 물론 숫자 인식 정도는 그리 크지 않은 신경망으로 가능하게 되었지만, 상용으로 쓸 정도의 문제는 대개 예외 처리가 어려운 문제(이를테면 이미지/음성 인식같은)에 대규모의 데이터를 넣어서 큰 신경망으로 해결하는 것이 딥러닝이라고 볼 수가 있겠다.

 

 이후 이런 딥러닝 기술들은 CNN이 주목한 이미지 인식 외에도, 시계열의 데이터를 처리하는, 즉 말의 흐름을 다루는 RNN이나 LSTM같은 시계열 처리로 이루어지고, Google BERT와 GAN을 거쳐 Transformer로 진화하게 되었지만(2010년대에 모두 이루어진 일이다) 그 주요 기반이 신경망인 것은 그다지 변하지 않았다. 그리고 하나 짚고 넘어갈 일은 '생성형'이 유행하게 된 사실이다. 적대적생성신경망(GAN)에서 유래한 이 개념은, 과거에는 단순히 판정에 집중했던 것에 반해서, "이해를 했다면 생성도 가능하다"는 지능의 한 분야를 발전시킨 개념이다. 생각보다 쓸모가 다양하고, 생성형 언어모델로 이끌기 까지 했지 않는가.

 

 좀 여러가지 생략을 했는데, 따라서 딥러닝은 단순한 통계 모형으로 풀기 어려운 복잡한 문제를 지향하고, 큰 신경망과 대량의 데이터, 컴퓨팅을 요구하는것이 기본이다. 물론 LoRA같은 소규모의 부분 튜닝 학습도 존재하기는 하지만 기본적으로는 그렇다. 그리고 단순 수치에 대한 해석과 예측은 별개로 잘 발전한 decision tree류의 모델(gradient boosting모델, LGBM, XGBoost, ..)들도 훨씬 효과적일 때가 많다. 특히 데이터가 부족하고 컴퓨팅이 부족한 실제 산업 현장에서는 요긴하게 사용된다. 또한 딥러닝을 한다고 하면서 파라메터 크기가 몇만개 정도 수준이면 좀 애매하게 볼 수도 있겠다. 복잡한 문제를 풀기에는 너무 작은 크기 아닌가?

 

 그리고 AlexNet 논문의 공저자이자 OpenAI의 수석과학자였던 Sutskever가 논의했던 신경망의 크기도 짚고 넘어가보자. OpenAI를 시작했을때도 이 신경망의 크기를 키우면 잘 될것이라는 아이디어는 결과적으로 상상력이 부족했다. 엄두가 안나는 크기인 수십억, 수백억 파라메터 크기까지 늘리면 잘된다는 사실을 본인도 처음부터 시도한 것은 아니라고 고백하는 인터뷰를 본 적이 있다. 여하튼 그렇게 딥러닝은 이제 수백억 수천억 파라메터를 지닌 크기의 신경망을 다루게 되었다. 하나 더 팁을 주자면 이 크기의 신경망을 학습하기 위해서는 그저 인터넷상에 널려있는 수없는 텍스트 문장이 있으면 되게 되었다. 하나하나 분류 결과가 필요했던 이미지와는 차원이 다른 데이터 금맥이 발견된 셈이다. 그래서 이 엄청난 텍스트 문장 데이터와 거대 신경망 모델이 오늘날의 딥러닝을 대표하지 않나 생각이 든다.

 

 그래서 이러한 배경을 놓고 딥러닝을 이야기하면 조금더 현실적으로 논의할 수 있겠다. 그래서 문제 구분없이, 작은 신경망으로 문제를 해결하면서 딥러닝을 한다고 하는 주장을 하면 아무래도 좀 아쉬운게 많은 것은 연결주의자들의 생각이 아닌가.

 

반응형
Posted by 작동미학
머신러닝AI2024. 9. 6. 22:48

 Stable Diffusion보다 훨씬더 이미지를 잘 생성해주는 Flux.1이 출시되었다. Stable Diffusion에서 나와 창업한 이들이 만들었고, 상업용과 공개용 모델이 공존한다. 아무래도 Stable Diffusion의 라이센스가 강화됨에 따라, Flux.1이 각광받을 것 같고, 기본 모델로도 고해상도에서 꽤 잘 이미지를 생성해준다. 아래는 NVidia RTX 4090 (24GB)에서 실행해보았으며 12GB이하 메모리를 지닌 GPU에서는 별도의 조치가 필요하다.

 

0. 아래는 간단히 생성해본 1024 * 1024 이미지다. 품질이 좋다!

"a modern soldier on the battle field"

 

1. Flux.1을 지원하는 ComfyUI 및 ComfyUI-Manager를 설치한다.

 

https://github.com/comfyanonymous/ComfyUI 에 접속한 후 화면 하단의 아래 Direct link to download를 통해 압축파일을 다운받는다. 그리고 적절한 폴더에 압축을 푼다. 여기서은 d:\dev\ 폴더에 압축을 풀었다고 가정한다.

[Direct link to download를 눌러 파일을 1.5GB 정도 되는 ComfyUI를 다운로드 받는다]

 

곧이어 위 압축을 푼 폴더의 하위 ComfyUI/custom_nodes에서 git으로 아래와 같이 다운로드 받는다.

 

> cd D:\dev\ComfyUI_windows_portable\ComfyUI\custom_nodes

> git clone https://github.com/ltdrdata/ComfyUI-Manager.git

 

이후  ComFyUI는 아래와 같이 실행하는데, 일단 모델 파일들을 받아보자.

 

> cd D:\dev\ComfyUI_windows_portable

> run_nvidia_gpu.bat   (혹은 GPU가 없다면 run_cpu.bat도 실행가능하다)

 

 

2. 아래 모델 파일들을 다운로드 받는다. hugging face에 공개된 모델들이고, hugging face에 가입한 후 필요하면 사용 동의를 해주어야 정상적으로 다운로드 받을 수 있다.

 

 a. https://huggingface.co/Kijai/flux-fp8/tree/main 에서 2개의 파일을 다운로드 받아 아래에 복사해준다. (fp8버전으로 받자)

 

   d:\dev\ComfyUI_windows_portable_nvidia\ComfyUI_windows_portable\ComfyUI\models\unet\

 

 

 b. https://huggingface.co/black-forest-labs/FLUX.1-dev/tree/main/vae 에서 2개의 파일을 다운로드 받아 아래에 복사해준다.

 

d:\dev\ComfyUI_windows_portable_nvidia\ComfyUI_windows_portable\ComfyUI\models\vae\

 

 

 

c. https://huggingface.co/comfyanonymous/flux_text_encoders/tree/main 에서 2개의 파일을 다운로드 받아 아래에 복사해준다.

 

d:\dev\ComfyUI_windows_portable_nvidia\ComfyUI_windows_portable\ComfyUI\models\clip\

 

d. 아래 사이트 에 접속해서 Download로  json 파일을 하나 받아준다.

 

https://openart.ai/workflows/maitruclam/comfyui-workflow-for-flux-simple/iuRdGnfzmTbOOzONIiVV

 

workflow-comfyui-workflow-for-flux-simple-iuRdGnfzmTbOOzONIiVV-maitruclam-openart.ai

(flux 구성을 기초적으로 한 파일이다. ComfyUI를 실행해서 화면에 drag&drop으로 넣어줄 파일이다)

 

 

3. ComfyUI를 실행한다.

 

> cd D:\dev\ComfyUI_windows_portable

> run_nvidia_gpu.bat   (혹은 GPU가 없다면 run_cpu.bat도 실행가능하다)

 

잘 실행되면 아래 비슷한 화면이 나온다. 여기에 아까 받았던 json을 drag & drop으로 화면위에 떨궈준다. 그러면 기본적인 셋팅이 완료된다.

 

ComfyUI 윈도우에서 실행한 화면
상기 과정을 거쳐 실행된다.

 

 기본 셋팅으로 쓰면 이름이 제대로 설정이 안되서 아래 3가지 셋팅의 명칭은 확인해서 바꿔준다. (Load Diffusion Model, DualCLIPLoader, Load VAE 3가지 박스이다. 다운받은 파일들로 바꿔준다.

 

이제 Prompt에 적당한 표현을 넣고, Queue Prompt를 눌러보면, 1024*1024로도 멋진 사진이 잘 나오는 것을 알 수 있다. 고해상도에서 기본모델인데도 꽤 잘나온다. RTX 4090으로 약 30초 미만으로 생성되었다. 속도 자체는 기존 Stable Diffusion과 비슷했다.

 

고해상도 이미지를 잘 생성해주고 있다.

 

12GB이하 메모리의 GPU에서는 별도의 방법이 필요하다고 한다. 우선 여기서는 24GB GPU에서 실험한 결과를 공유한다.

 

반응형
Posted by 작동미학
머신러닝AI2024. 9. 5. 21:42

 이 이야기가 어떤 도움이 될지는 잘 모르겠지만, 여러가지 참고가 될 수도 있지 않겠는가 기대를 해본다.

 

 처음에 사람의 지능이나 기억 등에 관심을 갖게 된 것은 환상특급이라는 미국 SF 시리즈를 접했을 때이다. 정확히 기억은 안나지만, 사람의 기억에 대한 이야기이며, 사람의 기억을 비디오로 재생하는 모습이 기억난다. 거기서 사람의 기억은 영상으로 그대로 보여졌다. 90년 전후의 기억이다.

 

 이 때의 첫 의문은 정말 사람의 머리속 기억이 저렇게 영상으로 기억될까? 였다. 그리고 곧바로 그렇지 않을 것이라고 생각했다. 영어사전을 첫장부터 계속 넘기면서 본다고 해보자. 과연 그것이 영상으로 머리속에 남아있을까? 우리는 초인적인 능력을 발휘하면 머리속에서 그것을 모두 찾아낼 수 있을까? 전혀 그렇지 않을 것이라고 생각한 것이다. 상식과 부합하지 않다고 봤다.

 

 이후에는 이러한 지능에 대한 여러가지 고민 속에 유물론적 사고관이 자리잡기 시작했다. 그것은 진화론, 특히 지금은 진화심리학이라고 알려진 것과 함께했다. 그렇게 아예 기존에는 전혀 개념이 없던, 정신의 작동에 대해서 여러가지 내적인 질문/답변을 통해 이런저런 가설을 세우고 정리할 수 있다는 사실을 깨닫게 되자, 지능을 이해하고 구현할 수 있다는 생각이 중고등학생 시절 들기 시작했다. 돌이켜보면 사실은 별로 이해한 것도 없었지만, 아예 모호한 것에서 어떠한 틀이 생겼다고 판단되면, 사람은 그것을 대부분 이해했다고 착각하게 된다.아마도 1950년대 최초로 AI를 논하던 서양의 학자들이, 곧 그것을 만들 수 있다고 믿었던 것도 비슷한 맥락이라고 생각한다. 조금만 체계가 잡히는 것처럼 보여도 곧 나머지는 시간문제처럼 여겨지게 된다. 여러가지의 논리적인 체계를 수립하고 독서의 과정 중에서 타인의 의견까지 확인되면 자신감이 생기는 것도 있었다. 여러 학자들의 단편적인 주장들이 내 추측과 다르지 않다는 것을 알게 되었던 것이다. 

 

 그렇게 96년경 대학 학부에 들어가기 전부터도 나는 지능을 구현할 수 있을 것이라는 확신을 가졌으며 이를 위해 여러가지 관련 지식을 찾기 시작했다. "인지과학" 학회에 참여하거나, 여러가지 대학교 교양을 그러한 분야로 정해서 들었다. 그런데 전공을 전산학을 하고 수업을 인공지능을 들었지만, 의외로 그 수업은 수학적인 지식을 쌓거나 단순 알고리즘에 대한 것이 전부였다. 돌이켜보면 그 모든 것이 기초였지만, 당시에는 내가 만들고자 했던 인공지능과는 거리를 좁히기는 어려웠다. 그러한 것들은 지능이 보여주는 복잡성 대비해서는 너무 "단순했고, 피상적이었다".

 

 그러던 와중에 복잡계와 인공생명을 접하게 되었다. 인터넷을 통해서 지속적으로 정보를 확인하고, 책을 보다보니 두 분야가 눈에 들어왔다. 가장 인상깊은 것은 인공생명 내에서 소개한 'Life Game'이었다. 즉, 단순한 법칙이 대규모로 되먹임으로 반복되면 창발성이 발생한다는 단순한 논리며, 자가 복제하는 생명이 탄생한다는 것이다. 그리고 신경망이나 진화학습 알고리즘을 접하던 것이 2000년이 조금 넘은 시기였던것 같다. 그러다가 한동안 병역문제를 해결하기 위해 2000년부터 2004년까지 소프트웨어 개발자 생활을 했고, 오직 광범위한 프로그래밍 문제에 메달리게 되었다. 어찌보면 이 시기는 코딩이나 오픈소스, Fast Prototyping 등 공학적인 관심을 다양하게 발산하던 시기였다고 생각한다. OS나 디버깅 등 원없이 이러한 소프트웨어 개발 시기를 보냈다. 나는 제품을 만들고 고쳐야했으며 거기에 충실히 임했다. 그런 후에 병역 문제가 해소되자, 전부터 생각하던 AI를 공부하기 위해 석사과정을 지원했다.

 

 다만, 입학후 당시에 학계에서 유행하던 알고리즘은 SVM(Support Vector Machine)이었고, 학교는 충실히 그 방향을 따랐다. 그 모델의 수학적인 완성도나 OCR 개선, high resolution, 필기체 생성 등 과제가 몸담았던 랩의 중요한 과제들이었고, 인공생명이나 신경망 같은 것에 대한 관심은, 학계 전체적으로 그 추상적인 것들을 어떻게 해결해야 할지 갈팡질팡하는 논리적 혼란을 겪으면서 진행되던 시기였다. 신경망은 학습할 때마다 결과가 다른 변덕스러운 녀석이었으며(유전자 알고리즘도 마찬가지였다), 신경망이 조금만 복잡해져도 잘 학습되지 않았고, 실험 결과는 며칠이나 걸려도 구하기 어려웠다. 신경망이 한참 각광을 받다가 천덕꾸러기가 된 시기였다. 이를 타개하려면 Hiton교수 랩에서 deep nets라는 이름으로 우회해서 논문이 등록되는 최소 2006년을 기다려야 했다.

 

 그러한 학계 맥락에도 불구하고, 기본적인 머신러닝의 절차. 즉 데이터를 준비하고 다듬고, Feature를 만들고 다양한 모델을 돌리며, 그것을 코딩하고 결과를 얻는 과정에 대해서는 잘 배울 수 있었다. 이론을 다지기는 짧았지만, 실무는 잘 이해할 수 있었다. 당시의 AI란 통계 모델이었으며, 가급적 Feature는 다양한 데이터에 대해서도 일관성을 갖추도록 최선을 다해서 변이가 줄어드는 것을 잘 선택해야 했으며, 그에 기반하여 단순한 모델들이 그것을 잘 학습하게 하는 것이 지상 목표였다. 특히 석사과정인 나에게는 더욱 그랬다. 우리가 아는, 사람의 일반적인 지능과는  다른 것이었지만, 그러한 노력들이 이를테면 인쇄체 인식분야에서는 꽤 빠르고 정확한 성능에 다다르는 것은 가능하게 되었다. 즉 변화가 다양한 현실에 대해서 최대한 그 다양성을 없애려는 것이 오히려 그 시기 내 노력의 대부분이었다고 생각한다. 모델의 개선이란 쉽지 않은 수학적인 주제 중의 하나였다.

 

 그래서 "복잡한 지능적 문제"는 도대체 인간이 어떻게 푸는지 감을 잡을 수도 없었다. 예컨데 인쇄된 문서가 아니라 자연상태의 간판같은 것들을 찍어서 인식하는 문제(scene text recognition)는 너무도 그 변이를 표준화할 수 없어서, 완전히 풀기 불가능할 정도의 문제였다. 랩에서 그런 이야기를 종종 들었던 기억이 있다.

 

 그럼에도 불구하고 언급했던 것처럼 통계 모델들이 향하는 본질은 이해할 수 있었다. 그것은 데이터를 통해서 공간상에 여러가지 경계선을 긋는 작업이었도 이를 기반으로 분류를 행해주는 일을 주로 하는 수학적인 과정이었다.

 

 다만, 2004~2006년 당시에 '진화'와 '신경망'이라는 개념은 내게 크게 다가왔다. 도대체 지능을 환원적으로 바라보고 구현할 수 없다면, 그것이 가늠할 수도 없이 복잡하다면, 신경망 같은 구조에서 창발성을 기다려야 하고, 그 구조는 진화알고리즘 같은 것으로 계속 바꿔줘야 한다고 생각했다. 2006년까지 석사과정을 마치면서, 내 머리속에 떠오른 이 지능 구현에 대한 해결책은 다음과 같았다.

 

 1. 신경망을 구성한다(혹은 다른 모델일 수도 있겠다. 그런데 다른 창발성을 일으킬 수 있는 모델이 떠오르지 않았다.)

 2. 유전자 알고리즘으로 계속 구조를 바꾸고

 3. 자연과 비슷한 시뮬레이터(경쟁과 생존이 있는) 상에서 그것을 계속 실험하고 진화시킨다

 4. 그러다가 말을 하고(?) 지능을 갖추면 멈춘다.

 5. 이것을 엄청나게 반복한다.

 

 사실 여전히 나는 이 방법론이 실제 지능의 문제를 개선시킬 것이라고 믿는다. 중간에 너무나 비약이 크지만(3번과 4번사이에 간격이 너무 크다고 생각한다) 다른 뾰족한 방법이 없었다. 따라서 나는 당시에 3번 즉 시뮬레이터를 연구해야한다고 생각했다. 과연 어떠한 복잡도로 자연과 유사한 시뮬레이터를 만들어야 지능을 탄생시킬 정도로 할 수 있을까? 너무 단순하면 잘 학습이 안되지 않을까, 너무 복잡하면 구현하기가 어렵고 느리다. 물리적인 환경은 어디까지 해야할까? 그리고 당시에 선배들의 논문 속에 '진화연산신경망'이라던가 이런 개념들이 너무나 인상 깊었다. 이 시뮬레이터의 틀을 그 복잡성 관점에서 수학적으로 분석할 수 있지 않을까?

 

 그 시기 즈음에, 따라서 저런 방법론을 가지고, 사업을 해서 돈을 번 후에 연구소를 만들어서 지능을 만들 수 있지 않을까 상상하던 시기다. 지능에 대한 유물론적인 접근을 나는 할 수 있다고 믿었기 때문이다. 병행하여 신경과학이라던가 여러가지 생물의 구조나, 굉장히 초기 진화 단계의 생명체나 뇌(이를테면 곤충이나 미생물) 같은 것에도 관심을 가졌다. 그런 것들이 모두 재료가 되거나 힌트가 될 수 있다고 생각했기 때문이다. 다양한 책을 접했으나 특별한 돌파구를 찾지는 못했다. 여전히 시뮬레이션이 그 시기 내 가장 큰 관심사였다. 하지만 이러한 주제에 진지하게 접근하기는 쉽지 않았다.

 

 그런데 돌이켜보면 실제 학계는 내가 노력하는 방향과는 다소 차이게 있게 발전하고 있었다. 내 석사시절이 끝날 시기 즈음에 토론토 대학 Hinton 교수 연구실에서는 신경망을 끈질기게 팠었고, 결국에는 고전적인 back progation방법 외에 학습 방법 몇가지를 추가로 개발하며면서, 실질적으로는 젊은 연구자들(Alex)에 의해 GPU를 이용해 신경망 크기를 늘리는 묘안을 생각한 한 것이다(2012발표). 어떻게 보면 나는 시도해보지 못했을 방법이라고 고백할 수 있다. 복잡계를 통해 어떤 단순한 기능이 있고 그 기능을 반복하면서 창발성이 일어난다는 힌트는 가지고 있었지만, 그것이 엄청나게 큰 신경망을 통해서 학습이 안정될 수 있다고는 잘 상상이 되지 않았고 그러한 것을 상상해야 할지도 모르던 시절이다.

 

 그러나 힌튼 교수팀은, 그때까지도 모호했지만, 그 두가지의 원동력을 발견한 셈이다. 즉 신경망을 키워도 적절한 속도로 학습할 수 있는 방법을 찾았으며, 신경망을 키워도 GPU를 통해서 계산할 수 있는 현실성을 갖추게 된 것이다. 그것이 곧바로 구글의 대규모 데이터와 투자가 만나면서 2010년도 초반의 CNN 랠리가 시작되었다. 사실 나는 그때는 신경망으로 뭔가 문제가 잘 해결된다는 것이 신기했다. 다만 그 신경망을 키우는 문제에 대해서는 여전히 다른사람과 같이 무지했다. 그저 데이터가 엄청많으면 CNN이라는 사람의 시각과 비슷한 방법으로 아주 일부 문제가 해결될 수 있구나 정도를 인지했다.

 

 오히려 그 시기는 구글 딥마인드의 강화학습이 더 매력적이었다. 시뮬레이터에서 시뮬레이션하면서 진화시킬 수 있는 방법을 마침내 찾게 된 것이다. 아타리 게임을 자동으로 하면서, 학습할 수 있는 것들의 학습 체계 구성은 내게 너무나 매력적이었다. 그러나 사실 강화학습은 데이터를 실시간으로 만들어서 대량 학습시킬 수 있는 것과 다르지 않았다. 당시에 깨달아야 했던 것은 신경망이 커져도 학습이 가능하다는 것과, 신경망을 키우면 더 복잡한 문제를 잘 풀 수 있게 구성할 수 있다는 것이어야 했다. 그리고 그것은 일리야 서츠케버가 OpenAI에 재직하면서 2020년 전후에 점점 더 강하게 깨달은 것이기도 했다. 그것은 수백억어치의 컴퓨팅과 엄청난 데이터 등 몇가지를 추가로 필요로 했기 때문에, 쉽게 알아내기는 어려운 방향이었다.

 

 그러나 과학자들은 생각보다 더 빠르게 신경망의 크기를 키워갔고, 이후에는 자연어 corpus라는 label을 하지 않아도 되는 거대한 학습 데이터를 재발견했으며, 이렇게 대량의 학습을 시킨 후에 fine tuning을 통해 사람처럼할 수 있다는 것을 깨달은 것이 바로 2020년대 전후의 이야기다. Google BERT를 시작으로 Transformer구조가 나오면서 사실은 이것이 조금씩 알려지기 시작한 것이다. 그리고 OpenAI의 ChatGPT출시는 2020년 후에 벌어지게 되었다. Google도 BERT크기를 경험하면서 더 키워볼 생각을 아마 했을 것이다. 그러나 OpenAI는 실제로 그것을 실행하고 그리고 발표까지 해버렸다. 

 

 돌이켜보면 이 2020년을 전후한 이 10년 남짓한 시기가 바로 완전하게 대규모 신경망에 대해서 인류가 깨닫게 된 시점이라고 생각한다. 그리고 인터넷에 널려있는 대규모의 언어데이터와 연산량, 그리고 적절하게 학습시킬 수 있는 신경망 학습법과 구조가 현대의 LLM을 탄생시켰다. 즉 digital brain을 실제로 작동시켜서 어느 정도 수준에 올라올 수 있다는 점을 보여주었다.

 

 물론 이 LLM이 사람만큼의 능력을 보여주지는 않는다. LLM은 상당히 복잡한 예외들에서도 단순한 논리들은 일정수준 이상 안정적으로 학습하는게 기존의 여느 모델대비 크게 향상된 점이다. 그리고 개인적으로는 흡사 사람의 뇌와 비슷한 방식으로 작동한다고 믿는다. 여러모로 LLM은 digital brain(사람과 비슷한 구조로 신경망을 가지고 작동된다)을 따르며, 과연 무엇이 다를까 싶을 정도로 인간 뇌와 유사한 능력을 보여준다. 여전히 인공신경망의 뉴런은 사람의 실제 신경세포와 매우 다르다고 하지만, 여러 부분 유사할 것이라는 강력한 믿음을 가지고 있는 것이다.

 

 또한 최근에는 이 digital brain을 연구함으로써 사람의 뇌를 더 이해하게 되고 그에 기반해 뇌를 더 자세히 분석해서 이를 digital brain개선에 이용할 수 있는 것이 아닌가 생각이 들기도 한다. 그리고 이는 Google/OpenAI/Anthropic등의 회사에서 자신이 만든 LLM모델을 가지고 연구하고 있다. 어떻게 단어의 의미가 신경망에 반영되고 그것을 신경망을 어떻게 수정해야 변형시킬 수 있는지 보고 있는 것이다. 다만 아직도 얀 르쿤같은 경우에는 실제 지능의 문턱에 오지 못했다고 생각한다. 그리고 나는 여전히 더 커진 연산량을 바탕으로 지속 진화를 통해 신경망을 개선하는 강화학습 형태의 무엇인가가 등장할 수 있다고 믿는다.

 

 여기서 얻은 또하나의 깨달음은 바로 제프 호킨스의 생애에 대한 점이다. 이 분은 팜파일럿의 창업자로 내가 꿈꾸었던 것과 동일하게 회사를 성공시키고 매각한 후 산타페에 인공지능 연구소를 차려서 연구를 하고 있다! 그리고 본인만의 다양한 방향으로 여러가지 연구를 하고 있다. 하지만 연구는 다양한 집단 지성하에 경쟁해야만 의미를 갖는게 아닌가라는 것을 이 분을 통해서 깨달았다. 인공지능의 연구란 개인이 어떤 돌파구를 마련하겠다고 진행할 수 있는 것이 아니다. 그것은 급격한 새로운 시도와 그것이 이전과 완전히 새로운 문을 열어주는 것들을 반복해야 한다. 엄청난 자금과 공유, 그리고 시도와 집단 지성은 불가능한 일을 해내는 거의 유일한 방법 같아 보인다. 그것이 내 개인적인 깨달음이고, 아마 앞으로도 그렇게 흘러가리라 생각한다.

 

 여하튼 내가 생각했던 것과 전혀 다르게 AI는 발전해버렸지만 아직도 꿈꾸고 있는 셈이다. 이미 인간은 구현되어 우리 눈앞에서 지능을 작동시키고 있고, 단지 우리는 그 세부만을 모를 뿐이다. 언제고 발견되기를 인간이 지구상에서 생각을 시작하는 순간부터 기다리고 있는 셈이다. 곧 그 의미를 파악할 수 있는게 아닌가 여전히 생각한다. digital brain이 2020년에 우리 앞에 나타나고 더 발견되기를 기다리고 있다.

 

반응형
Posted by 작동미학
머신러닝AI2024. 5. 25. 21:40

 그동안 뇌를 이해하기 위한 측정은 MRI를 통해서 진행되었다. 특정 생각을 할때 혈류량을 측정해서 시각화하여 연구하는 방식이다. 그런데 이 방식은 여전히 한계가 있고 가장 중요한 한계점은 해상도가 낮다는 점이다.

 

 예를 들어, 기능적 자기공명영상(fMRI)은 뇌의 활동을 시각화하는 데 사용되지만, 그 해상도는 매우 낮아 세밀한 신경 활동을 포착하는 데 제한적이다. 그러나 최근의 연구는 대규모 언어 모델(LLM, Large Language Model)을 활용하여 뇌 연구의 새로운 길을 열 수 있음을 시사한다.

 

 LLM은 이미 그 내부 구조와 가중치, 계산값 등을 실시간으로 관측할 수 있는 특성을 가지고 있다. 이는 LLM을 디지털 뇌로 간주하고 이를 분석하는 것이 실제 뇌 연구에 유용할 수 있음을 암시한다(물론 둘의 유사성이 있다는 가정하이지만). 구체적으로, LLM의 모든 레이어와 노드의 결과값들을 표준화하여 시각화하는 방법을 제안할 수 있다. 예를 들어, LLM이 문장을 입력받아 토큰을 생성할 때마다 각 레이어와 노드의 값을 0에서 255 사이의 수치로 변환하여 1,000x1,000 픽셀의 이미지로 만들 수 있다. 이러한 이미지를 연속적으로 배열하여 영상을 생성하면, 마치 fMRI 영상처럼 LLM 내부의 신경망 작동 패턴을 시각적으로 관찰할 수 있다. 모델이 너무 크다면 몇개 주변 픽셀을 합쳐서 averaging할 수도 있고, 영상을 몇개로 분할할 수도 있겠다.

 

 이 방법은 LLM의 작동 원리를 이해하는 데 큰 도움이 될 뿐만 아니라, 인간의 뇌 연구에도 혁신적인 기여를 할 수 있다.

 

 LLM은 다양한 언어 데이터를 학습하여 추상화하는 능력을 가지고 있다. 따라서 LLM의 각 노드의 결과값 매트릭스를 분석하여 패턴을 찾는다면, 이는 인간의 뇌가 정보를 처리하는 방식을 이해하는 데 중요한 단서를 제공할 수 있다. 값이 많다는 점이 장애물이 될 수 있지만, 데이터를 구석구석 나누어 발화 패턴을 추상화하고 이를 다시 통합한다면, 대규모 신경망 구조에서도 의미 있는 패턴을 발견할 수 있을 것이다.

 

 이러한 접근 방식은 다음과 같은 과학적 가능성을 열어준다.

  1. 신경망의 시각적 분석: LLM의 내부 작동을 시각적으로 분석함으로써, 뇌 활동을 이해하는 새로운 방법을 제시한다. 이는 전통적인 fMRI보다 훨씬 높은 해상도를 제공할 수 있다.
  2. 추상적 패턴의 발견: LLM의 데이터를 통해 추상적 발화 패턴을 발견하고 이를 인간의 언어 처리 과정과 비교함으로써, 인간의 언어 처리 메커니즘을 더 잘 이해할 수 있다.

  3. 신경과학 연구의 새로운 도구: LLM을 디지털 뇌로 활용하는 연구는 신경과학자들에게 새로운 도구를 제공하여, 기존의 뇌 연구 방법론을 보완하고 확장할 수 있다.

 결론적으로, LLM을 활용한 디지털 뇌 연구는 인간의 뇌를 이해하는 데 새로운 길을 열어줄 수 있는 잠재력을 가지고 있다. 이를 통해 우리는 인간의 인지 과정, 언어 처리 메커니즘, 그리고 전반적인 뇌 기능에 대한 깊은 통찰을 얻을 수 있을 것이다. 앞으로의 연구는 이러한 가능성을 현실로 만들기 위한 구체적인 방법론을 개발하고, 이를 통해 신경과학의 새로운 시대를 여는 데 기여할 수 있지 않을까.

반응형
Posted by 작동미학
머신러닝AI2024. 5. 1. 10:53

윈도우(windows)에서도 easy_diffusion과 kohya_ss를 어느 정도 실행해서 이미지 합성에 대한 작업을 진행할 수 있다.

Windows 10 pro + RTX 4080 (536.23 driver) 기준의 환경에서 실행해 보았다. 명령은 모두 command 상에서 실행한다

(윈도우키+R을 누른 후 cmd를 실행하면 명령 실행이 가능하다)

 

 

1. easy_diffusion

 

 

이 설치는 너무나 간단하다. 아래 링크에서 Windows용 Easy Diffusion 최신 버전을 받자

https://github.com/easydiffusion/easydiffusion/tree/main#installation

 

이 글을 쓰는 시점에서는 Easy Diffusion 3.0이 최신이다. 아래 Download for Windows 버튼을 누르고 실행해주면 된다. linux/mac/windows 동일한 방식으로 간단하게 실행해서 웹 인터페이스로 생성해볼 수 있다.

 

[easy_diffusion의 윈도우 설치 가이드 포함 페이지]

 

[easy_diffusion을 실행 설치하면 나오는 화면이다.내부에 conda와 git을 자체로 가지고 있다]
[설치가 끝나면 역시 자동으로 브라우저가 떠서 실행해볼 수 있게 된다.]

 

실제 사용 관련해서는 다른 글들을 참조하면 된다. models/stable-diffusion/ 에 사용하는 모델파일을 넣어 사용해보자(civit.ai에서 checkpoint 모델들을 크기가 크지만, 다양하게 다운로드 받을 수 있다. https://infoengineer.tistory.com/122 를 참조하자)

 

2. kohya_ss

 

모델을 학습하기 위한 kohya_ss에 대한 설치이다.

 

A. python 10와 git이 필요하다.

 

    개인적으로는 Anaconda설치를 권한다. 따라서 Anaconda 사이트에서 윈도우용 Anaconda를 설치하고

    아래와 같이 실행한다. git은 윈도우용 git을 다운로드받아( https://git-scm.com/download/win ) 기본옵션으로 설치하여 실행하면 된다. (만약에 python 3.10을 직접 설치해서 곧바로 진행한다고 하면 그렇게 해도 상관없다.)

 

    D:\dev\conda> conda create -n kohya_ss python=3.10

    D:\dev\conda> conda activate kohya_ss

 

B. git으로 kohya_ss를 checkout 하고 setup.bat를 실행한다.

 

    D:\dev> git clone https://github.com/bmaltais/kohya_ss.git 

    D:\dev> cd kohya_ss

    D:\dev\kohya_ss> setup.bat

 

 이때 NVidia GPU 사용자는 2번을 눌러 cudnn을 최신으로 받아주자. 시간이 조금 걸린다(고속화에 도움이 된다고 한다)

 그런 후 1번을 선택해 Kohya_ss를 GUI로 실행한다.

 

setup.bat 실행 후 화면, 2번과 1번을 차례대로 선택해주자.

끝나면 7. Exit Setup을 선택해서 나오면 된다.

 

C. 아래와 같이 실행하면 내부에 웹서버가 뜨면서 우리가 활용할 수 있는 단계로 진입한다.

 

 D:\dev\kohya_ss> gui.bat

kohya_ss 윈도우 실행화면

 

위의 마지막 부분에 표시된 http://127.0.0.1:7860 주소를 브라우저로 열어보자. kohya_ss의 gui가 보인다. 해당 사용법 관련해서는 연관 글을 참조한다. ( https://infoengineer.tistory.com/134 )

kohya_ss의 윈도우가 보인다.

 

 

 

 

 

 

반응형
Posted by 작동미학
머신러닝AI2024. 4. 27. 17:16

오픈소스 LLM 모델을 local에서 띄워서 구동하는 가장 손쉬운 방법은 ollama 이고 지난번에 소개한 적이 있다.

https://infoengineer.tistory.com/135

macos에서도 구동되기 때문에 너무나 간단하게 llama3, gemma, phi-3, command-r 등 어느정도 한글이 되는 모델들을 다운로드 받아서 구동시킬 수 있다.

 

그리고 일단 이렇게 구동되면 langchain과도 바로 연결된다.

 

$ ollama run llama3:instruct
>>> give me a joke
Here's one:
Why don't eggs tell jokes?
(wait for it...)
Because they'd crack each other up!
Hope that made you smile!
>>> Send a message (/? for help)

 

이렇게 구동이 되면 내부에 API 서버가 이미 구동되어 대기 상태가 된다(ollama serve 명령으로도 띄우는 것이 가능하다)

이후에는 아래와 같이 시험해볼 수 있다.

 

$ curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt":"Why is the sky blue?"
}'
{"model":"llama3","created_at":"2024-04-27T08:10:00.736586071Z","response":"What","done":false}
{"model":"llama3","created_at":"2024-04-27T08:10:00.746743823Z","response":" a","done":false}
{"model":"llama3","created_at":"2024-04-27T08:10:00.757109205Z","response":" great","done":false}
{"model":"llama3","created_at":"2024-04-27T08:10:00.768475258Z","response":" question","done":false}
....

{"model":"llama3","created_at":"2024-04-27T08:10:04.094431458Z","response":".","done":false}
{"model":"llama3","created_at":"2024-04-27T08:10:04.104777568Z","response":"","done":true,"context":[128006,.....,128009],"total_duration":3490085755,"load_duration":2410324,"prompt_eval_count":11,"prompt_eval_duration":75044000,"eval_count":327,"eval_duration":3368118000}

 

아니면 이제 langchain을 사용할 수도 있다.

 

$ cat > langchain_ollama_stream.py 
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_community.llms import Ollama

llm = Ollama(
    model="llama3", callback_manager=CallbackManager([StreamingStdOutCallbackHandler()])
)
llm("The first man on the summit of Mount Everest, the highest peak on Earth, was ...")

$ python3 langchain_ollama_stream.py 

....

....

 

그 외에도 다양한 방식의 langchain사용이 가능하다. 잘 응용해서 사용해보자.

 

 

1) 간단한 invoke

 

from langchain_community.llms import Ollama

llm = Ollama(model="llama3")

llm.invoke("Tell me a joke")

 

 

2) 간단한 stream 형식의 출력

 

from langchain_community.llms import Ollama

llm = Ollama(model="llama3")

query = "Tell me a joke"

for chunks in llm.stream(query):
    print(chunks, end="")

 

반응형
Posted by 작동미학
머신러닝AI2024. 4. 27. 16:46

AI로 무엇을 하다보면 linux에 GPU로 환경을 구성하는데, 도대체 잘 이해가 가지 않는 것이 이 버전 관계다.

Ubuntu 버전, GPU 버전, NVidia driver버전, cuda 버전, cudnn 버전... 등등 헷갈린다. 이제 그 관계를 이해해보자.

 

결론은 지금 '24년초 시점에서는 Ubuntu 22.10, NVidia driver는 GPU버전에 맞는것(홈페이지 참조), CUDA는 11.8을 중심으로 설치하자. cudnn은 8.7 정도를 선택하면 되고 쉽게 바꿀 수 있다. 각각의 버전을 바꾸고 싶은데 다시 깔아야 할지 고민인가? 아래를 따라가보자.

 

 

0. 요약해보면 아래와 같다

  A. NVidia driver는 여러개를 설치할 수 없고 내 GPU, 원하는 CUDA버전에 맞는 가장 최근의 driver를 설치한다

  B. CUDA는 여러개의 버전을 설치해서 LD_LIBARY_PATH만 잘 바꾸면 그때그때 바꾸어 쓸 수 있다

  C. cudnn은 CUDA안에 library만 교체하면 되므로 역시 필요할때마다 특정 CUDA버전의 버전을 덮어쓸 수 있다.

       만약에 cudnn도 같은 CUDA에 여러가지 버전을 쓰려면 똑같은 CUDA를 여러개 복사해서 설치 한후, 그 각각에 cudnn을 설치하고 LD_LIBARY_PATH를 변경해서 쓰는 신공도 가능하다. cuda-11.8.A, cuda-11.8.B 식으로 설치하는 식이겠다

 

 다만 버전 결정 순서는, 내가 쓸 프레임웍이 지원한는 CUDA 버전은? 그에 맞는 내 GPU에 호환되는 NVidia driver 버전은? 그에 맞는 cudnn버전은? 그리고 python 버전은? 식으로 결정되어 간다. cuda, cudnn, python은 여러개의 버전을 설치해놓고 번갈아가면서 쓸 수 있다.

 

1. 먼저 필요한 CUDA 버전이 중요하다. CUDA 11.8이 가장 많이 호환되는 CUDA 버전이다.

 

 판단기준 : 내가 쓰는 프레임웍(pytorch, tensorflow?)이 지원하는 CUDA는 무엇인가? 대개 11.8이다

 

 CUDA는 최근에 11, 12시리즈가 시장에서 주력으로 사용되는데, 많은 오픈소스 ML 프레임웍이 11버전을 지원한다.

 특히 우리의 가장 중요한 친구 pytorch 2.1 미만 버전들이 CUDA 11에 의존한다. tensorflow나 주력으로 쓰는 framework들이 지원하는 버전을 확인해서 만약에 CUDA 12를 지원한다면 12버전을 쓸 수도 있겠다. 하지만 아직은 최신 프레임웍의 버전들만 간신히 지원하는 CUDA12를 쓸 용기는 없다. 우리는 가져다 쓰는 기존 소스코드들은 예전 버전인 경우가 더 많기 때문이다. 물론 CUDA12에 최신 버전 프레임웍을 설치해서 새로 소스코드를 짤 수도 있겠지만 그런 경우는 흔하지 않겠다.

 

 그러니 CUDA 11.8을 설치하자. 참고로 아래는 tensorflow의 버전별 CUDA + cudnn 버전이다. 각 프레임웍들이 각각 이런 정보를 공개한다.

https://www.tensorflow.org/install/source?hl=ko#gpu

 

 그리고 CUDA를 여러가지 버전으로 설치할 수 있을까? 정답은 Yes이다. 원하는 CUDA버전을 설치하면

 /usr/local/cuda-x-x/ 식으로 설치되고 이 디렉토리가 /usr/local/cuda로 심볼릭 링크가 걸린다(어떤 패키지들은 이 /usr/local/cuda를 참조하기 때문이다)

 

여러개의 cuda버전을 어떻게 참조할까? 바로 LD_LIBRARY_PATH라는 lib파일 참조 경로를 바꾸면 된다. 이 설정을 각 계정의 .bashrc에 반영하면 기 계정으로 로그인하면 해당 환경을 자동으로 사용하게 된다. 계정마다 별도의 설정으로 진행하자.

 

$ export PATH=/usr/local/cuda-x-x/bin:${PATH}

$ export LD_LIBRARY_PATH=/usr/local/cuda-x-x/lib64:${PATH}

 

 심볼릭 링크를 바꾸어 주어야 하는 상황이면 아래처럼 한다

 

$ cd /usr/local/

$ ls -al cuda          #해당 명령으로 지금은 어느 버전으로 연결되었는지 확인하자

 cuda -> cuda-y-y

$ rm cuda

$ ln -s /usr/local/cuda-x-x cuda

 

CUDA를 설치할때는 linux의 경우 아래와 같이 run local을 다운로드 받은 후 아래 driver를 먼저 설치한 후, 실제 CUDA설치시에는 해당 driver를 skip하고 설치하여 혼란을 방지한다.

NVidia에서 다운로드 받을때 예시(runfile로 받아서 driver는 아래 먼저 깔고, 여기서는 skip한다)

 

아래 드라이버와 CUDA설치가 같이 이루어지게 되는데, 잘 맞지 않는다면 언제나 아래 명령으로 처음부터 다시 설치할 수 있다.

 

$ sudo apt install -y ubuntu-drivers-common   #맨처음이라면

 

$ sudo apt-get purge nvidia*

$ sudo apt-get autoremove

$ sudo apt-get autoclean

$ sudo rm -rf /usr/local/cuda*

 

$ sudo apt install build-essential      #gcc가 없는 경우

$ sudo ubuntu-drivers devices     #추천 nvidia drivers를 찾을 수 있다(recommended)

$ sudo apt install nvidia-driver-535  #추천받은버전

$ reboot

 

이후 cuda를 다시 설치하되, nvidia driver만 skip하고 설치한다.

(ex> $ sudo sh cuda_11.8.0_520.61.05_linux.run  / nvidia driver는 uncheck하고 진행)

 

2. NVidia driver는 아래와 같은 CUDA와의 호환 관계를 갖는다. 최신 CUDA는 최신 NVidia driver가 필요하다.

 

 판단기준 : 내가 쓰는 CUDA 버전이 최신일수록, 최신의 NVidia driver를 가져다 설치해야 하는데, 내가 가진 GPU카드별로 지원하는 Driver 버전이 다르다. 오래되거나 어떤 GPU는 Driver 버전 지원도 나쁘다. 거꾸로 내가 써야할 CUDA 버전을 지원하는 NVidia driver를 지원하는 GPU를 사야할 수도 있다. 

 

 즉 어느정도 Driver 버전 이상이 되어야, 최근의 CUDA 버전이 지원된다. Linux와 Windows가 조금 다른 것에 주의하자.

아래가 대략의 정보이고 세부 정보는 이 링크를 확인해보자. https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

 

 그리고 언급했듯이, 유의할 것은 해당 Driver 버전 중 일부는 특정 GPU 카드를 지원하지 않을 수 있다. 따라서 내가 가진 GPU 카드가 지원되는 드라이버 버전을 선택하자. 각 지원 버전은 NVidia 사이트에서 역시 확인이 가능하다. 신기하게도 GPU마다 지원되는 버전이 들쑥날쑥하니 꼭 내 GPU카드가 지원하는 버전을 확인해두어야 한다.

 

 혹시 내가 설치해서 쓸 OS Linux Package들이 이 드라이버 버전을 띄엄띄엄 지원할 수도 있으니, 아예 Linux에서 배포판 별로(ubuntu?) 지원되는 버전별로 찾아봐서 내 GPU를 지원하는지 확인할 수도 있다.

 

https://www.nvidia.co.kr/Download/index.aspx?lang=kr

 

대략 NVidia driver 525나 520, 515버전 등을 많이 설치하긴 한다. 여기서는 CUDA 11.8을 추천하려고 하므로 520이상 버전을 설치하려고 노력해보자.

 

참고로 아래 명령을 통해 linux에 설치된 GPU정보나, 추천 드라이버를 제공받을 수 있다

 

$ lshw -C display           #RTX4080예시이다

  *-display                 
       description: VGA compatible controller
       product: NVIDIA Corporation
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:01:00.0
       version: a1
       width: 64 bits
       clock: 33MHz

$ sudo ubuntu-drivers devices          #RTX4080예시이다

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002704sv00001462sd00005111bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-545-open - third-party non-free
driver   : nvidia-driver-535 - third-party non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-525-server - distro non-free
driver   : nvidia-driver-550-open - third-party non-free
driver   : nvidia-driver-550 - third-party non-free recommended
driver   : nvidia-driver-525 - third-party non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-525-open - distro non-free
driver   : nvidia-driver-545 - third-party non-free
driver   : nvidia-driver-535-open - distro non-free

 

 불행히도 nvidia driver는 multi로 쓸 수는 없고, 다시 설치하고 reboot해야한다. (다만 recommended가 너무 낮지 않으면 그것을 선택하면 좋다)

 

 

3. Ubuntu 버전과는 어떻게 되는가? 23.10보다는 22.04가 더 유리하다.

 

 판단기준 : Ubuntu 배포판 버전이 아니라, 설치된 gcc 버전이 중요하다. CUDA 11을 컴파일하기 위해 구 버전인 gcc 10이 필요하기 때문이다.

 

 Ubuntu 23.10은 GCC 13버전 컴파일러를 디폴트로 사용하는 반면, CUDA 11/cudnn 등 컴파일에 GCC 10가 필요다. 그래서 사실은 Ubuntu 23.10을 사용해도 GCC 10버전 컴파일러를 디폴트로 정하면 CUDA 11을 쓸 수 있다! 그런데 이 Ubuntu에서 GCC 버전을 왔다갔다 설정하면서 설치할 배짱이 없다면 그냥 Ubuntu 22.04을 설치하자. 

 

혹시 Ubuntu 23.10을 써야한다면 아래 가이드를 참고하자. gcc 버전을 바꾸어 설치하는 방법과 다시 gcc 버전을 원복하는 방법이 나와있다.

https://www.yodiw.com/install-cuda-11-on-ubuntu-23-10/

 

그래서 이러한 번거로움 때문에 Ubuntu 22.04을 설치해서 운영하도록 추천하게 된다.

 

 

4. cudnn은 어떻게 할까?

 판단기준 : CUDA 처럼 사용하는 프레임웍별로 필요한 버전을 설치해줘야한다. 대략 8.7 버전 정도가 현재는 제일 무난하다.

 

 cudnn의 8.7.0버전은 CUDA 11과 12모두 각각에 개별 버전별로 따로 있다(즉 cudnn 8.7 버전이 CUDA 11, 12에 각각 별개의 배포판이 있다). 다행히 이 cudnn은 설치 후에도 쉽게 교체 및 추가 할 수 있다. 여러개를 설치하고 전환도 가능하다. 그저 배포하는 압축파일을 풀어서 폴더 그대로 기존의 설치된 cuda폴더의 include/lib 파일만 교체해주면 그만이기 때문이다.

 

예를 들면 CUDA가 /usr/local/cuda-11.8로 설치되어 있고 /usr/local/cuda -> /usr/local/cuda-11.8로 링크가 걸려있다고 치자. 그러면 cudnn은 해당 버전 압축 파일을 받아, 파일의 압축을 적절한 곳에 푼 다음에 아래처럼 복사해 덮어 씌우면 된다.

물론 버전이 바뀔때마다 같은 작업을 하면 된다. 그러니까 여러 버전의 압축을 풀고, 쓸때마다 버전을 바꾸어 복사한 후 필요한 프로그램을 실행하면 된다.

 

아래를 통해 cudnn 배포판 다운로드 (로그인이 필요하다) 하고 그 이하의 절차로 include/lib파일을 복사해버리자.

https://developer.nvidia.com/rdp/cudnn-archive

 

$ tar -xvf ${CUDNN_TAR_FILE}
$ sudo cp -P cuda/include/cudnn*.h /usr/local/cuda-11.8/include/
$ sudo cp -P cuda/lib/libcudnn* /usr/local/cuda-11.8/lib64/
$ sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

 

간단하게 버전을 어떻게 잡으면 될지 잡아보았다. 상기 모두 정상 설치되면 아래 명령을 통해 설치 정보를 알 수 있다.

 

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

$ nvidia-smi

Sat Apr 27 16:54:09 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0  On |                  N/A |
|  0%   39C    P8    25W / 320W |    592MiB / 16376MiB |      0%      Default |

 

흥미로운 것은 위 nvidia-smi의 CUDA은 추천 cuda 버전이다.

 

실제 설치 cuda 버전은 nvcc 명령으로 확인하자.

 

 

5. python 버전은 어떻게 할까?

 

 이것이야말로 실행할 프로젝트에 따라 다른데 대략 3.9~3.11정도가 추천되고 있다. 각 프로젝트별로 매우 세분화된 python버전을 요구할 수 있다(3.10.8이상 등). 따라서 설치할 프로젝트를 유심히 보는 수 밖에 없다. 하지만 우리는 여러개의 프로젝트를 실행하게 되기 때문에, 이 문제를 해결하기 위해 Anaconda(conda)를 사용하게 된다. 각 환경 별로 서로 다른 python과 package를 설정해 다중으로 사용하게 할 수 있는 합리적인 방법이다. Anaconda설치는 간단히 웹서핑해서 최근의 버전을 설치하면 된다. 서로 다른 버전으로 서로 다른 패키지 환경을 구성해 실행하는 것이 Anaconda의 마법같은 장점이다.

 

 Anaconda를 설치한 후 아래와 같은 형태로 이 python 버전에서 자유로워지자. 꼭 미리 conda create 명령으로 전용 환경을 구성한 후 conda activate를 통해 해당 환경을 활성화하고 실행하는 것이다. 디스크 용량을 필요로 하긴 하지만, 이보다 더 편안한 방법도 드물다. 적극 활용하도록 하자. (설치 경험이 없으신 분은 https://jongsky.tistory.com/21 를 참조하자) 아래는 대표적인 환경 구성 및 활성화, 설치 명령이다.

 

$ conda create -n llama2 python=3.9 -y

$ conda activate llama2

(llama2) $ pip install ...

$ ..

$ exit

 

 

이제 이 글을 몇번 앞뒤로 왔다갔다 하면서 설치해서 사용해보면, 여러분은 이제 어떤 버전이든 대응할 수 있게된다.

 

반응형
Posted by 작동미학
머신러닝AI2024. 4. 20. 11:51

ollama는 많은 오픈소스 모델을 쉽게 구동해주는 프로젝트이다.

 

$ curl https://ollama.ai/install.sh 

$ chmod 755 install.sh

>> Downloading ollama...
######################################################################################################################################################################## 100.0%######################################################################################################################################################################## 100.0%######################################################################################################################################################################## 100.0%
>>> Installing ollama to /usr/local/bin...
[sudo] userid 암호: 
>>> Adding ollama user to render group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
>>> NVIDIA GPU installed.

$ ollama serve  #설치 후 자동 실행되지만 나중에는 이렇게 실행하면 된다.
Error: listen tcp 127.0.0.1:11434: bind: address already in use
$ ollama run llama3
pulling manifest 
pulling 00e1317cbf74... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB                         
pulling 4fa551d4f938... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  12 KB                         
pulling 8ab4849b038c... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  254 B                         
pulling c0aac7c7f00d... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  128 B                         
pulling db46ef36ef0b... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  483 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success 
>>> IT팀에 첫 부임하는 팀장인데 한글로 멋진 연설문을 써줘
Here's a potential team leader speech for your IT team in Korean:

---

**환영, 팀!**

저는 이날 처음으로 IT팀의 팀장이 되어 честь을 받은 것입니다. 함께 일하게 될 각자에게 고마워하는 기회를 가질 수 있습니다. 저는 이렇게 팀을 이끌어갈 수 있는 영광을 느끼고 있습니다.

** 우리의 사명 :*
우리 팀의 목표는 단순합니다. 이를 달성하기 위해 저는 각자의 강점과 재능을 활용하여 최고의 성과를 내겠습니다. 우리는 개별적으로는 아니라, 함께 일하는 조직체입니다. 기업의 성공을 위한 혁신적인 솔루션을 제공하며, 협동, 창의, 지속적 학습의 문화를 형성하겠습니다.

** 우리의 강점 :*
각자가 가진 Unique Skill, Perspective, Expertise 등을 활용하여 더 큰 것을 만들 수 있습니다. 우리는 소프트웨어 개발부터 지원까지 다양한 업무에 종사할 것입니다. 저는 각자의 재능을 믿고 있습니다.

** 앞으로의 도전 :*
저는 도전이 있을 줄 알아요. 하지만 저는 각자에게 믿음을 갖고 있습니다. 우리는 함께 도전을 맞아내고, collective Wisdom, Creativity, Determination 등을 사용하여 어떤도전이라도 이겨낼 것입니다. 우리는 실수를 통해 성장하고, 더 강한 팀이 될 것입니다.

** 이를 기대할 수 있는 것은 :*
저는 팀 리더로서 다음과 같은 약속을 합니다.
1. **오픈 커뮤니케이션** : 각자의 아이디어, 우려, 제안 등을 들으겠습니다. 각자의 목소리가 들립니다.
2. **클리어 골스** : 우리는 실제적 목표를 설정하여, 누구나 무엇을 위해 일하는지 알 수 있습니다.
3. **서포트 & 리소스** : 저는 각자가 필요한 도구, 교육, 지원 등을 제공할 것입니다.
4. **리코gnition & 레워즈** : 우리는 우리의 성공을 축하하고, 개인적인 공헌을 인정하여 서로를 이끌어갈 것입니다.

** 미래 :*
저는 이제 새로운 챕터에 들어가게 될 것 같습니다. 저는 이 팀이 어떤 것을 성취할지 궁금해합니다. 함께 이룰 수 있는 것은 무엇인지 찾아보겠습니다!

---
I hope this speech is inspiring and motivating for your IT team! Remember to tailor it to your team's specific needs and goals. Good luck with your new role as team 
leader! 🚀
---------------------------------------------------------------------------------------------------------
아래 링크에 ollama로 구동할 수 있는 모델이 나온다. llama3는 8B 4bit quantized 모델로 4.7GB정도 용량이다.

참고로  $ ollama run llama:70b 형태로 70B모델도 구동도 가능하다. 아래 각 모델의 세부 정보를 통해 어떤 형태까지 구동할 수 있는지 태그명을 알 수 있다.

 

https://ollama.com/library/

 

추천하고 싶은 한글이 어느정도 되는 모델들은 아래와 같다

$ ollama run gemma:instruct (한글이 그래도 나온다!)

$ ollama run llama3:instruct (한글로 설명해달라고 하면 제법 한다)

$ ollama run command-r (cohere의 모델인데 20b이지만 한글이 꽤 된다)

$ ollama run codegemma:instruct

 

 

https://ollama.com/library/llama3, 각 세부 모델도 실행가능하다. ex> llama3:70b

 

 

 그리고 마지막으로 허깅페이스에 올라와있는 gguf 모델은 ollama create명령으로 설정하여 역시 사용할 수 있다. 해당 모델을 받고, 주소 등이 담긴 modelfile을 작성해서 custom 모델 사용이 가능한 것이다. 

 

https://huggingface.co/teddylee777/Llama-3-Open-Ko-8B-Instruct-preview-gguf/tree/main

에서 모델 파일을 다운로드 받고 ( Llama-3-Open-Ko-8B-Instruct-preview-Q6_K.gguf 를 예시로 보자)

 

$ ollama list
NAME            ID              SIZE    MODIFIED
gemma:instruct  a72c7f4d0a15    5.0 GB  3 hours ago
gemma:latest    a72c7f4d0a15    5.0 GB  About a minute ago

 

$ cat > modelfile
FROM ./Llama-3-Open-Ko-8B-Instruct-preview-Q6_K.gguf

TEMPLATE """[INST] {{ .System }} {{ .Prompt }} [/INST]"""

PARAMETER stop "[INST]"
PARAMETER stop "[/INST]"

SYSTEM "You are my AI assistant. you should answer in Korean"

 

$ ls

modelfile

Llama-3-Open-Ko-8B-Instruct-preview-Q6_K.gguf


$ ollama create llama-3-open-ko-8b-q6 -f modelfile
transferring model data
creating model layer
creating template layer
creating system layer
creating parameters layer
creating config layer
using already created layer sha256:62c16633326decbe7273021ad9178315347282763373fac0654773e35deeeb41
writing layer sha256:e6836092461ffbb2b06d001fce20697f62bfd759c284ee82b581ef53c55de36e
writing layer sha256:9aa5bc598c7961cbdfa0ec4dc7f94384f8dd2d6a314997b7900dc95ebf30c790
writing layer sha256:ed11eda7790d05b49395598a42b155812b17e263214292f7b87d15e14003d337
writing layer sha256:c0e945a015bccb863dcba3fb16fc7f9aed7fb244a4ea7401c91d72561881e759
writing manifest
success

$ ollama list
NAME                            ID              SIZE    MODIFIED
gemma:instruct                  a72c7f4d0a15    5.0 GB  3 hours ago
gemma:latest                    a72c7f4d0a15    5.0 GB  6 minutes ago
llama-3-open-ko-8b-q6:latest    e3420f154241    6.6 GB  50 seconds ago

 

$ ollama run  llama-3-open-ko-8b-q6

>>> 서울의 관광지를 소개해줘

 서울은 한국의 수도라 문화적, 역사적으로 중요한 도시예요. 추천해 주세요. 그리고 가 봐야 할 곳이 있어요. 1. 경복궁: 조선  왕조의 주요 궁궐, 꼭 봐야 하는 방문지 2. 남산 타워: 서울을 상징하는
이 타워는 숨막히는 전망을 제공해요 3. 북촌 한옥 마을: 한국 전통 건축을 보여주는 마을 4. 명동 쇼핑 지구: 현대 한국의 패션, 쇼핑을 경험하세요 5. N서울타워: 관람 데크에서 도시의 파노라마
뷰를 즐기세요. 가장 먼저 방문하고 싶은 곳은요?

반응형
Posted by 작동미학
머신러닝AI2024. 4. 6. 01:05

이 문서는 ubuntu 22.04 + NVidia RTX 4080 H/W 하에서 진행하였다.

 

Stable Diffusion을 웹인터페이스 학습시킬 수 있는 kohya_ss 프로젝트가 존재한다. 여러가지 보조 기구를 제공해주고, 이미지가 있으면 자동으로 설정을 하고 학습까지 시켜준다. 단 아래는 전체 학습은 아니고 LoRA 즉 소규모의 부분 튜닝만 해주는 방법이다.

(그정도만으로도 꽤 성능이 향상된다고 알려져있다.)

 

https://github.com/bmaltais/kohya_ss

 

0. 아래를 먼저 진행한다

 

우선 다음을 준비할 필요가 있으며, CUDA와 cudnn은 아래 링크를 참조하여 설치한다. https://infoengineer.tistory.com/96

 

  1. CUDA 11.8

  2. python 3.10.9이상~3.11미만

  3. cudnn 8.7.0

 

따라서 용량이 충분한 디렉토리에서 아래와 같이 입력한다.

 

$ conda create -n kohya_ss python=3.10

$ conda activate kohya_ss

$ git clone https://github.com/bmaltais/kohya_ss

$ cd kohya_ss

$ sudo apt update -y && sudo apt install -y python3-tk               #python3-tk를 필요로 하는데 일반적으로 미설치되어있다

$ ./setup.sh

Skipping git operations.
Ubuntu detected.
Python TK found...
Switching to virtual Python environment.
22:33:35-474863 INFO     Python version is 3.10.14 (main, Mar 21 2024, 16:24:04) [GCC 11.2.0]                                                                                                                   

..

22:36:35-016860 INFO     Configuring accelerate...                                                                                                     
22:36:35-017576 WARNING  Could not automatically configure accelerate. Please manually configure accelerate with the option in the menu or with:       
                         accelerate config. 

 

위와 같은 accelerate warning이 뜨면 직접 실행해준다.

 

$ cd venv/bin

$ ./accelerate config

------------------------------------------------------------------------------------------------------------------------------------------------------In which compute environment are you running?
This machine                                                                                                                                           
-------------------------------------------------------------------------------------------------------------------------------------------------------Which type of machine are you using?                                                                                                                   
No distributed training                  #GPU가 여러개일 경우만 분산선택                                                                                                          
Do you want to run your training on CPU only (even if a GPU / Apple Silicon / Ascend NPU device is available)? [yes/NO]:  #계속엔터입력                           
Do you wish to optimize your script with torch dynamo?[yes/NO]:                                                                                        
Do you want to use DeepSpeed? [yes/NO]:                                                                                                                
What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:all                                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?                                                                                                     
fp16                                                                                                                                                   
accelerate configuration saved at /home/xxxx/.cache/huggingface/accelerate/default_config.yaml                                                        

 

$ cd ../..

$ ./gui.sh

22:53:19-311775 INFO     Kohya_ss GUI version: v23.0.15                                                                                                
22:53:19-399403 INFO     Submodule initialized and updated.                                                                                            
22:53:19-402531 INFO     nVidia toolkit detected                                                                                                       
22:53:20-026297 INFO     Torch 2.1.2+cu118                                                                                                             
22:53:20-029252 ERROR    Could not load torch: cuDNN version incompatibility: PyTorch was compiled  against (8, 7, 0) but found runtime version (8, 5, 
                         0). PyTorch already comes bundled with cuDNN. One option to resolving this error is to ensure PyTorch can find the bundled    
                         cuDNN.Looks like your LD_LIBRARY_PATH contains incompatible version of cudnnPlease either remove it from the path or install  
                         cudnn (8, 7, 0)      

 

---------------------------------------------------------------------------------------------------------------------------

혹시 위와 같은 cudnn 라이브러리 오류가 나면 cudnn 8.7.0 for CUDA11.8을 NVIDIA에서 다운받아 설치해주자.

CUDA 폴더에 cudnn의 파일만 잘 복사해주면 된다.

 

$ tar xvfz cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz       #nvidia 사이트에서 cudnn archive 다운로드가능

#아래와 같이 파일을 복사하여 설치한다.

$ sudo cp -P cudnn-linux-x86_64-8.7.0.84_cuda11-archive/include/cudnn.h /usr/local/cuda-11.8/include/
$ sudo cp -P cudnn-linux-x86_64-8.7.0.84_cuda11-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
$ sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*

---------------------------------------------------------------------------------------------------------------------------

cudnn 버전 오류가 없다면 아래와 같이 gui.sh를 실행해서 웹서버를 띄우고, 웹에 접속한다.

 

$ ./gui.sh

0:35:53-556439 INFO     Kohya_ss GUI version: v23.0.15                                                                                                
00:35:53-578951 INFO     Submodule initialized and updated.                                                                                            
00:35:53-579987 INFO     nVidia toolkit detected                                                                                                       
00:35:54-373093 INFO     Torch 2.1.2+cu118                                                                                                             
00:35:54-377101 INFO     Torch backend: nVidia CUDA 11.8 cuDNN 8700                                                                                    
...                                                                                         
Running on local URL:  http://127.0.0.1:7860

실행 상태에서 브라우저를 띄워 http://127.0.0.1:7860 에 접속한다.

드디어 kohya_ss의 web UI가 뜬다.

kohya_ss의 GUI

 

이제 본격적인 학습을 위해 이미지를 준비하고 이 이미지의 script를 구할 차례다.

 

1. 학습에 추가시킬 이미지를 마련한다.

 

  대략 500*500 이상 해상도로 준비해두면, 자동으로 caption을 생성해서 학습에 사용할 수 있다. 특정 폴더에 모아두고, 시험목적이라면 10장 정도면 되겠다.

 

2. 자동으로 captioning(이미지별 설명을 담은 txt 파일 자동 생성)을 해보자.

 

 아래와 같이 Utilities->Captioning의 BLIP Captioning에서 image folders를 선택 한 후 맨 오른쪽 아래 Caption Images를 실행한다. 해당 폴더에 이미지와 같은 이름의 txt파일이 생겼음을 알 수 있다.

image captioning
생성된 이미지 captioning 파일 예시 (원래는 이미지만 있었는데 txt가 추가됨)

 

3. 이제 LoRA탭/Training중간의 Dataset Preparation으로 가보자. 오른쪽 화살표를 클릭해서 열자.

LoRA/Training 메뉴의 하단 Dataset Preparation을 설정하자

 

 Dataset Preparation설정 들 중에서 Instance prompt에는 튜닝할 파일의 이름을 적당히 넣고, Class prompt는 나중에 호출할때 쓸 적절한 명칭, 그리고 가장 중요한 학습할 이미지의 폴더를 입력해주고, 이 모든 학습의 중간 데이터 등을 저장할 폴더를 하나 추가로 지정해주자(Destination training directory).

 그리고 차례로 하단의 'Prepare training data'버튼과 'Copy info to Folder Tab'버튼을 각기 차례대로 누르면, 학습할 이미지가 해당 destination folder로 이동되어 준비되고, 이 설정들이 상단의 Traing정보로 복사된다(캡춰 화면에서는 보이지 않는 위쪽에 반영된다)

Instant Prompt/Class prompt, trainging images 폴더 등 정의하자

 

 

3. Parameters를 변경한다

 그 다음은 이제 Parameters 를 열어서(Dataset Preparation바로 위) 아래와 같이 Presets를 sd15 - EDG_LoraOptiSettings로 예시 선택해보자. Epoch을 필요하면 약간 늘려준다. 4080으로 1 epoch당 몇분이 소요됨을 가정하자. 학습 진행 중에 대략 10GB전후의 GPU메모리가 사용되었다.

Presets를 선택해준다.

 

 

4. 맨 상단의 설정을 최종으로 정하자.

 그리고 맨 상단의 Pretrained model name은 적절히 기본 모델을 선택하자. 여기서는 sd-v1-5.safetensors 를 복사해두고 적용했다. 이 모델은 Stable Diffusion 유명한 기본 모델이며. 다른 모델을 써도 당연히 된다.

 

Pretrained model name을 선택하자 / safetensors와 fp16도 선택해주었다.

 

이제 맨 하단의 Start training을 누르면 학습이 시작된다.

 

한 epoch씩 학습이 진행된다.

 

 상기 케이스의 경우는 destination folder(/work2/kohya_ss/dest/)의 model 폴더에 75mb정도 크기의 safetensors형태의 LoRA모델이 생겼음을 알 수 있다. 이 만들어진 LoRA는 이제 Stable Diffusion에 잘 알려진 방법대로 원래 모델(여기서는 sd-v1-5.safetensors)과 함께 넣어 사용하면 되겠다. civit.ai의 LoRA들이 모두 이런 방식의 학습에 의해서 제공된다.

 

 

반응형
Posted by 작동미학
머신러닝AI2024. 3. 1. 09:32

 

개인비서 서비스가 LLM덕분에 가시권에 들어왔다. Siri도 그렇고 많은 사실은 많은 회사들이 이 개인비서를 꿈꿔왔다. 바쁜 현대인들은 대신 해줬으면 하는게 많기 때문이다. 인공지능이라는 이름으로 그동안 많은 서비스들이 이를 지향했는데, 사실 잘 안되었다. if-then 으로는 처리에 한계가 있었기 때문이다. 곧 사람들이 외면하기가 일쑤였다.

ChatGPT 생성


 그런데 LLM은 이미 OpenAI를 통해 어느정도의 사용자 경험을 인식시키고 있다. 청소년 정도의 응대만 가능해도 맡기고 싶은 일이 얼마나 많은가.

 

 하루를 한번 돌이켜보자. 몇시에 일어나서 밤사이 특별한 일은 없었는지(특히 해외 등), 날씨는 어떻고 우산을 가져갈지 말아야할지, 출근길에 특이한 정체나 사건은 없는지, 출근해서는 업무를 수행하기 위한 수많은 것들도 그렇고(임원들의 비서가 처리하는 수많은 것), 식당을 알아보고 일정을 조절하고는 기본이다.

 

 내 생활에서는 자녀를 위한 여러가지 교육 정보도 아쉽다. 내가 사는 지역에 특이한 일은 없는지, 내가 관심있는 주제는 어떤 변화가 있는지, 내 자산에는 알아야할 특이 정보는 없을지, 고민에 대한 상담, 여러가지 장기적인 관점의 진단은 특정 품질 이상으로 이런 것을 모두 챙겨줄 수 있다면 몇만원의 돈이 무엇이 아깝겠는가. 따라서 이 분야의 대형 서비스가 나올 수 있다고 생각한다.

 

 GPTs가 이런 비서 시장을 노릴테지만 여러가지 각각의 주제별로 조금더 전문화하고 다듬는 일이 필요하다. 그러다보면 각 전문분야별로 실제 정보나 컨텐츠가 부족하게 된다. 이러다보면 세상의 검색이나 여러가지 서비스가 API형태로 LLM이 쓸 수 있도록 변형되는 일이 가속화될것이다. 그렇게 더 발전하면 사람들이 직접 그 웹사이트에 들어가는 것보다는 API화 되어 LLM이 쓰는 양이 더 많아지고, 이제 사람들이 직접 사이트에 들어가는 것은 구식으로 느껴질 날이 올지도 모르겠다.

 

 이런 기술 환경의 핵심에는 Langchain같은 LLM을 다양하게 agent형으로 활용하는 오픈소스와 기존의 각종 서비스를 크롤링하고 API화되어가는 세상이 오는것. 비서 역할을 할 수 있는 사람이 있는 회사 임원들은 업무 사이트에 잘 들어가지 않는다. 사이트를 배우는 일도 큰 부담이기 때문이다. 이런 일을 LLM이 대신 해주는 세상이 곧 펼쳐지겠다.

 

 이런 변화가 오고있다. 영화 Her의 비서가 곧 세상을 점령해나갈 태세다.

반응형
Posted by 작동미학