머신러닝AI2024. 1. 13. 16:49

여러가지 다양한 오픈소스 모델이 쏟아지고 다양한 구동방법이 나오는데, 대부분은 HuggingFace를 통해 배포되고 있다.

 

이에 최근에 좋은 성능을 보인다고 알려진 SOLAR 10.7B 한글 튜닝 모델인 megastudy SOLAR 10.7B 모델을 구동해보자.

SOLAR 10.7B는 24GB이상의 GPU메모리에서 가동이 가능한 점은 참고가 필요하다.

 

여기서는 다양한 LLM을 연결해서 실행할 수 있는 langchain 프로젝트의 도움을 받는다.

 

$ conda create -n solar10.7b python=3.11

$ conda activate solar10.7b

$ pip install langchain langchain_community huggingface_hub transformers sentencepiece torch datasets

 

1. HuggingFace 가입 및 access token받기

 

우선 huggingface와 langchain으로 연계시키려면 access token이 필요한데, 가입 후 발급받으면 된다.

 

https://huggingface.co/settings/tokens

 

Hugging Face – The AI community building the future.

Forgot your password? SSO is available for companies

huggingface.co

 

여기서 받은 토큰을 아래와 같이 환경변수에 추가한다.

 

$ export HUGGINGFACEHUB_API_TOKEN="발급받은huggingface토큰"

여기서는 아래 모델을 사용해보자. 자동으로 모델을 다운로드 받아 실행하므로 langchain이 지원하는 대부분의 모델을 실행해 볼 수 있다.

 

https://huggingface.co/megastudy/M-SOLAR-10.7B-v1.3

 

2. LangChain을 통해 HuggingFace 모델을 실행해보자.

 

아래와 같이 실행한다.

 

$ cat > testlangchain.py

 

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.llms import HuggingFacePipeline

# HuggingFace의 model id를 삽입한다.
#model_id = 'mncai/mistral-7b-v5'
#model_id = 'maywell/Mistral-ko-7B-v0.1'
model_id = 'megastudy/M-SOLAR-10.7B-v1.3'


# HuggingFacePipeline object
llm = HuggingFacePipeline.from_model_id(
    model_id=model_id, 
    device=0,               # -1: CPU(default), GPU존재하는 경우는 0번이상(CUDA Device #번호)
    task="text-generation", # 텍스트 생성
    model_kwargs={"temperature": 0.1, 
                  "max_length": 128},
)

# template
template = """질문: {question}

답변: """

prompt = PromptTemplate.from_template(template)
llm_chain = LLMChain(prompt=prompt, llm=llm)

question = "서울에서 제일 유명한 산이 어디야?"
print(llm_chain.run(question=question))

 

아래와 같이 실행하면 모델을 local로 다운로드 받아 잘 구동하는 것을 알 수 있다.

 

$ python testlangchain.py

...
  warnings.warn(
tokenizer_config.json: 100%|███████████████████████████████████████████████████████████████████████| 1.46k/1.46k [00:00<00:00, 4.00MB/s]
tokenizer.model: 100%|███████████████████████████████████████████████████████████████████████████████| 493k/493k [00:00<00:00, 27.0MB/s]
special_tokens_map.json: 100%|█████████████████████████████████████████████████████████████████████████| 551/551 [00:00<00:00, 1.50MB/s]
config.json: 100%|█████████████████████████████████████████████████████████████████████████████████████| 720/720 [00:00<00:00, 1.81MB/s]
model.safetensors.index.json: 100%|█████████████████████████████████████████████████████████████████| 35.8k/35.8k [00:00<00:00, 182kB/s]
model-00001-of-00005.safetensors: 100%|██████████████████████████

..

서울에서 가장 유명한 산은 북한산입니다. 북한산은 서울 북쪽에 위치한 아름다운 산으로 많은 사람들이 등산하고 휴식을 취하는 곳입니다.

 

기타로 "IT개발팀에 새로 팀장이 되었는데, 팀원들을 북돋워줄만한 연설문을 써줘." 라고 질문하고 max_length를 2048로 하면,

"팀장 선임을 축하합니다! 저희 팀은 팀원들의 헌신과 노력으로 성공을 거두어 왔습니다. 저는 저희 팀의 새로운 팀장으로서 저희 팀원들의 헌신과 노력에 감사드리며, 저희 팀의 미래를 위해 함께 노력하겠습니다. 저희 팀은 ..." 라고 답변한다.

 

또한 llangchain은 openai API를 동일한 방식으로 연계해서도 사용할 수 있어서 다양하게 활용이 가능하다. GPU 메모리가 부족하다면 모델을 바꾸거나(주석의 #model_id = 'mncai/mistral-7b-v5' 참조), HuggingfacePipeline변수내 device=-1로 변경(CPU로 실행)하여 전환하여 실행해서 실험해볼 수 있다.

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

# HuggingFace의 model id를 삽입한다.
model_id = 'mncai/mistral-7b-v5'
#model_id = 'megastudy/M-SOLAR-10.7B-v1.3'


# HuggingFacePipeline object
llm = HuggingFacePipeline.from_model_id(
    model_id=model_id, 
    device=-1,               # -1: CPU(default), GPU존재하는 경우는 0번이상(CUDA Device #번호)
    task="text-generation", # 텍스트 생성
    model_kwargs={"temperature": 0.1, 
                  "max_length": 128},
)

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

반응형
Posted by 작동미학
시뮬레이션가설2023. 12. 17. 21:27

 소프트웨어 개발일을 하다보면, 이 컴퓨터가 어떻게 이렇게 잘 작동하는지 궁금해질 때가 있다. 언제나 같은 결과를 내놓고, 그리고 잘 "작동"한다.

 

 원래 그런 것으로 받아들이면 별로 관심 둘 일이 없지만, 생각해보면 신기한 일이다. 대체 이 계산력의 근간은 무엇일까? 과거에 톱니바퀴를 돌려 덧셈을 계산하던 계산기는 눈으로 보이기라도 하지만, 컴퓨터의 계산은 눈에 잘 보이지도 않는다. 그런데 어떻게 이렇게 "계산"을 잘 실행할 수 있을까?

 

라이프니쯔의 톱니 계산기 -&nbsp;https://smart.science.go.kr/scienceSubject/computer/view.action?menuCd=DOM_000000101001007000&subject_sid=257

 

 정답은 "자연의 계산력을 해킹한다"는 점이다. 기본적으로 톱니나 전자 소자도 마찬가지다. 자연의 물리 법칙에 맞게 작동하는 존재의 법칙 준수를 그대로 이용하는 것이다. 이는 최근의 양자 컴퓨터도 마찬가지인데, 현대의 모든 계산기는 자연 법칙의 일관된 작동에 기반하게 된다.

 

 톱니바퀴에 의한 계산기부터 살펴보자. 가장 간단한 것은 덧셈이다. 5+6=11이라는 것은 누구나 암산 할 수 있지만, 이것은 사람의 뇌의 힘을 빌어서 할때는 그렇다. 기계적으로 이 덧셈을 하려면 어떻게 할까? 가장 손쉽게 설명할 수 있는 것이 바로 "기계식 시계"이다. 기계식 시계는 세상에서 가장 오랫동안 개선 되어온 톱니 계산기 중의 하나이다. 60초는 1분이며 60분이 1시간이 되는 기본 구조를 가지고 초침과 분침이 돌며 숫자를 가리킨다. 즉, 60초가 되어 톱니가 한바퀴 돌면 더 큰 톱니를 움직여 1분을 더해주고, 그 1분이 60분이 지나 결국 더 큰 톱니를 조금더 움직여 1시간을 나타낸다. 60진법 덧셈 계산기인 것이다. 아래가 그 태엽에서 시작된 동력이 어떻게 초/분/시가 연결되어 나타내지는 보이는 구조이다. 각 축에는 시침,초침,분침이 연결된다. 맨 상단의 메인 스프링통이 돌면서 첫번째 휠이 아주 천천히 돌 것이고(시간), 그 정확한 비에 의해서 다음 휠이 그 다음 속도로 돌고, 또 그 다음 휠이 그 다음 속도로 된다. 그 비율은 1:60으로 고정되어 있다. 맨 하단에는 이 휠이 일정한 속도로 돌도록 일종의 진자 역할을 하는 밸런스 휠이 붙어 있다.

 

https://www.timeforum.co.kr/TFWatchColumn/87945

 

상기의 Second Wheel이 시침이며, Third Whell이 분침, Fourth Wheel이 초침이며 실제로는 아래와 같이 좀더 복잡하게 붙어있다. 그리고 시계의 맨 앞판에는 실제로 숫자와 눈금이 있어 우리가 숫자를 읽게 된다.

 

https://www.britannica.com/technology/balance-spring

 

 여기서 사용하는 자연의 법칙은 무엇인가? 단순한 물리 법칙이다. 톱니와 톱니가 맞물려있고, 그 돌아가는 비에 따라서 톱니가 다른 속도로 회전한다. 거기에 단순히 시침,분침,초침을 달아서 읽어 내면, 60진법의 덧셈을 하는 기계를 목격하게 되는 셈이다. 그리고 한마디 덧붙이면 이 계산기는 현대의 전자식 계산기에 비하면 효율이 떨어진다. 톱니가 많아지면 돌리기 어려울 뿐 아니라, 정확한 비율로 톱니가 깍여있지 않으면 많이 돌렸을 경우에 오차가 생기게 된다.

 

 그리고 1950년대 이전의 컴퓨터는 모두 위의 톱니를 사용하거나 아니면 전기의 힘을 일부 차용했다(진공관). 톱니가 아니고 어떤것으로 계산이 가능하지?

 

 놀랍게도 1950년대에 AT&T 벨 연구소에서 개발한 트랜지스터를 조합하면 이제 전기와 전자를 통해 이 계산을 수행할 수 있게 된다. 물리적인 힘이 아니라 전자적인 힘이기 때문에 효율이 매우 높다. 고속으로 계산할 수 있는 시대가 열린 셈이다.

 

윌리엄 쇼클리, 소위 접합 트랜지스터를 발명

 

 톱니의 회전에 의한 덧셈은 직관적이라서 쉽게 이해가 가지만, 과연 이 트랜지스터를 가지고 어떤 계산을 하는지 의아해 할 수 있다. 그러나 현대의 디지털 회로는 AND, OR, NOT 정도 구현할 수 있다면, 입력에 대한 다양한 출력을 제어할 수 있다. 그리고 이 AND, OR, NOT을 전기를 흘러서 변형하도록 할 수 있도록 하는 것이 바로 이 트랜지스터이다. 전기가 흐르지 않는 것을 0, 5V가 흐르는 것을 1로 약속하고, 트랜지스터를 적절히 배열하면, 입력되는 전기에 대해 출력되는 전기를 아래와 같이 제어할 수 있다.조금 더 단순화하면 이 트랜지스터는 전자적인 스위치이다. 사람이 손으로 선을 끊거나 이어주지 않아도, 전기를 흘리거나 흘리지 않는 방법으로 전기의 차단 여부를 결정할 수 있다. 즉 모든 입력에 대해 출력을 마음대로 바꿀 수 있게 된 셈이다. 그리고 이것을 회로 기판에 직접 그려서 고정시키면 H/W라고 표현하고, 더 복잡한 방식으로 구성해서, 이 논리회로 구조를 메모리에서 읽어서 소프트웨어적으로 바꿀 수 있게 만들어주면(즉 가변 회로) 그것이 바로 프로그램이 된다. 현대의 폰노이만 체계에 의해서, 이 디지털 논리회로는 프로그램에 의하여 입력/출력을 바꿀 수 있게 된 것이다. 그것이 현대의 컴퓨터이다(프로그램 내장방식까지 더해져서 편리함이 엄청나다. 예전에는 회로의 기능이 바뀌면, 배선을 손으로 다시 해주거나 회로 기판을 다시 만들어야 했다!)

 

가장 기본적인 논리 소자, AND/OR/NOT&nbsp;https://coolenjoy.net/bbs/37/2604

 

  하지만 이 복잡한 이야기 속에도, 그 근간에는 역시 전기와 전자의 물리적인 자연 법칙이 작동하는 것을 인간이 이용한다는 면에서는 자연을 해킹하는 것과 역시 같다. 그러면 여러분 만의 컴퓨터를 만드려면 어떻게 해야하는가?

 

 간단하다. 물리 법칙의 어딘가를 빌려다가 그 값으로 계산을 하면 된다. 오래된 되었지만 최근의 흥미롭게 다뤄지는 사례가 바로 아날로그 컴퓨터이다. 디지털 컴퓨터는 상기 0과 5V의 전압 차이를 가지고 0과 1로 단순화해서 계산한다. 그런데 그렇게 하면 여러 사이클을 반복하면서 계산해야 한다. 그런데 어차피 계산 값만 확보하면 되니, 0~10V를 각각 0에서 10이라고 가정하고 계산하면 더 빨리 계산할 수 있지 않을까? 저항을 나누고 싶은 값이나 곱하고 싶은 값으로 적절히 설정하면 된다. 이렇게 하면 장점은 매우 빠르게 계산할 수도 있다. 디지털 컴퓨터로는 수많은 사이클을 거쳐야만 하는 계산이, 회로를 한번만 작동시키면 값이 나오기 때문이다. 이를 잘 설명해주고 있는 것이 아래 베리타시움 채널이다.

 

https://www.youtube.com/watch?v=9ROD_oxpVcA

 

 

 그러면 양자 컴퓨터는 무엇일까? 바로 양자의 물리 법칙을 해킹해서 자연의 계산력을 가져오는 것이다. 이 양자의 물리 법칙이 보여주는 계산력은 대단하다. 어느 정도냐면, 몇가지 변환을 거치면 소인수 분해를 매우 빨리 할 수 있다. 기본적으로 자연의 계산력이라는 것은 소인수 분해를 고속으로 할 수 있었던 것이다.

 

 그래서 미래의 컴퓨터라는 것은 모두 이렇게 정의해볼 수 있다. 자연의 계산력을 훔쳐 쓰는 장치다. 사람의 암산은 그럼 다를까? 사람의 암산도, 신경세포의 조합에 의한 화학과 전기 법칙의 기반하에 작동하고 있고 역시 사람의 연산도 자연의 물리법칙을 차용한 셈이다. 결국 우리의 모든 계산력은 자연을 빌려다 쓰는 셈이다. 어떻게 돌려서 만들고 싶어도, 자연의 법칙에 의존하지 않는 계산기는 아직까지는 공식적으로 발견된 적이 없다고 할 수 있겠다.

 

 이런 시각은 어떤 면에서 도움이 될까? 바로 현대의 디지털 컴퓨터를 우리가 지배적으로 사용하고 있지만, 그것이 사실은 매우 특수한 형태였다는 점이다. 원래 자연을 어떻게든 해킹해서 더 다양한 컴퓨터를 만들 수 있었다. 많은 이들이 그런 상상을 해왔다면 현대는 더 다양한 컴퓨터들로 가득했을지 모르겠다. 그리고 이 모든 계산력이 결국 자연에서 왔다는 점도 개인적으로는 늘 인상깊다.

 

 

반응형
Posted by 작동미학
SW개발의수학적본성2023. 10. 14. 15:20

무한에 대해서 우선 이야기를 해보자.

 

 조지 가모프의 책 "1,2,3 그리고 무한"에 보면 칸토어의 무한을 설명하기 위해 3까지 밖에 세지 못하는 아프리카 호텐토트 부족의 이야기를 한다. 그러면 이 부족은 5와 10이 어떻게 다른지 세지 않고 알 수 있는가? 이는 "유한의 수를 세는 방법으로 무한을 다룰 수 없는데 어떻게 하지?" 라는 질문의 더 단순화된 버전이다.

 

 결론부터 이야기하면, 정답은 논리를 세워 비교하는 것이다. 기존의 숫자를 세어가는 형태의 단순 수학 기법에서, 그 숫자없이 두 그룹의 크기를 어떤 논리 체계로 세는 방법을 만들면 된다. 그리고 칸토어가 제시한 방법은 일대일 대응을 통해 이러한 체계를 만드는 것이다.

 

 그래서 자연수와 홀수와 짝수는 간단한 방법으로 빠짐없이 상호 대응시키는 방법을 찾아주면, 그 둘이 같다는 것을 증명할 수 있다. 무한이라는 셀 수 없는 수의 개념에 이렇게 세는 것과 유사한 효과가 나도록 논리적인 방법을 만든 것이다. 그래서 이것을 "논리로 센다"라고 표현할 수도 있다.

 

 마찬가지로 호텐토트 부족도 두 그룹의 원소를 하나하나 대응시켜 가면 남는 것이 있는 그룹이 더 많다는 것을 알 수 있다. 물론 정확히 수를 셀 수는 없었겠지만 최소한 많거나 적거나, 같다는 것을 알 수 있다. 그리고 칸토어의 논리에 따라, 앞서 이야기한 자연수나 홀수나 짝수는 사실 무한의 수 체계에서는 이름만 다른 같은 존재이다. 논리적으로는 다를 것이 없는 같은 무한 체계이다. 둘을 동일하게 서로 빈틈없이 짝지을 수 있기 때문이다.

 

          자연수) 1,2,3,4,5,6,7,...

          짝__수) 2,4,6,8,10,12,14...

          홀__수) 1,3,5,7,9,11,13... 

 

[자연수와 짝수, 홀수는 위와 같이 증가시켜 자연수에 1:1로 빈틈없이 대응시킬 수 있다]

 

 가만히 보면 이렇게 수학이란 기계화 할 수 있는, 즉 코딩화 할 수 있는 논리체계의 조합이다. 어떤 논리 체계를 세우고 그 논리를 조합해 가는 방식이다. 마치 컴퓨터 코딩이 어떤 절차를 지니고, 함수를 만들어서, 그 절차대로 진행시키는 것과 다르지 않다.

 

 이런 방식에서 수학적 증명의 일부는 이렇게 코딩으로 간접적으로 나타낼 수 있다. 이를테면 골드바흐의 추측을 예로 들어보자. 골드바흐의 추측을 검사하는 코드는 아래와 같다.

 

  for(int i=2;i<MAX;i=i+2) {

     if(checksumofprime(i)==false) {

          print("exception case\n");

  }

 

#checksumofprime은 i가 두 소수의 합인지 아닌지 검사

boolean checksumofprime(int n) {

     ....

}

 

 이 코드의 MAX가 무한대일때 위 코드가 exception이 출력이 되지 않는다면 골드바흐의 추측이 증명된다. 그리고 checksumofprime은 또 다른 코드의 조합으로 내려가서 만약에 특정 함수가 무한에 대해서 일관성을 지닌다면 그것은 증명이 끝난 것이고 나머지 함수들이 모두 증명이 되면 전체 증명이 끝나게 된다.

 

 만약에 제시한대로 상기 코드를 설계했을때 기계가 자동으로 어떤 형식체계로 그것이 무한일때 참인지 아닌지 판별할 수 있다면(모든 경우에 판별되지는 않겠지만) 상기 증명이 성립되게 된다.

 

 그런 면에서 수학은 여러 함수들을 가지고 순차적으로 실행해서 어떤 작동을 하는 프로그램을 닮았다. 그리고 그 특성도 비슷한데 이 논리들이 서로 다른 관점에서 "간결한 형태의 수정이 가능"하다면 무한대의 작동을 하지 않고도 옳바른지 알아낼 수 있다. 그런데 간결하게 또다른 논리체계로 바라보기 어렵다면 이제 증명이 쉽지 않게 된다. 이 경우는 다시 함수들을 더 분해하고, 증명된 함수들의 조합으로 설명해내야 하기 때문이다. (여기서 간결하게 수정이 가능하다는 것은 마치 '소수'라는 필터가 복잡한 절차를 거치지만, n번째 소수가 어떤 손쉬운 방법에 의해서 도출될 수 있는 것과 같은 변환 과정이다.)

 

 예를 들면 페르마의 정리를 보자. x^n + y^n = z^n을 만족하는 n이 2가 초과되는 x,y,z 정수 쌍이 없다는 증명이다.

역시 이 계산도 x,y,z,n을 각기 자연수 범위에서 모두 대입하여 조사하는 코드를 작성할 수 있다. 그러나 그 코드를 다른 논리체계로 변환하여 단순화하기가 매우 어렵다. 이 부분은 이제 인류의 노하우 영역으로 진입하게 된다. 칸토어가 무한의 체계를 1:1 대응 논리로 풀어냈듯이, 페르마의 정리를 위한 단순한 체계가 존재할까? 쉽게 찾을 수 없었기 때문에 이 체계에 대한 도출은 이제 길고 긴 시행착오가 된다. 수많은 함수들이 이 과정에서 사용될텐데, 전체를 관통하는 논리체계를 만들기 어려우니까 각 함수별로 분할하여 혹은 특정 함수는 더 세분화하여 각각을 증명해야 하기 때문이다. 일례로 n=2일때, n=3일때 식으로 차례대로 일부가 증명되어 나가는 과정도 유사하다.

 

 그러면에서 이런 식의 수학적 증명의 어떤 부분은 대형 SI 사업을 닮았다. 수많은 함수들과 세부 증명으로 분할하여 프로젝트를 다수의 인원이 오래 진행해야 하는 것이다. 그리고 그것이 최적화 되는 경우도 있지만 그렇지 않은 경우도 많다(결과적으로 복잡하고 긴 증명이 된다)

 

 나중이 되면 상기 코드의 점검을 다른 논리틀 하에서 컴퓨터가 자동 증명해주는 체계를 만들 수는 없을까? 특정 코드 유형에만 제약을 가해도 좋다. 아니면 몇가지 절차를 거쳐서 해도 좋다. 소수(prime number)에 대한 여러가지 규칙을 찾아내는 과정도 이러한 방향과 동일할 수 있다고 생각한다. 소수를 숫자의 원소라고 하지만, 코딩상에서는 1과 자기 자신외에는 나누어지지 않는 수라는 태깅 정도의 검사로 바라볼 수 있다. 이러한 명확한 정해진 검사절차를 어떻게 다른 시야에서 보고 그 코딩의 경계까지 모두 아우르는 다른 논리 해석을 자동으로 만들 수 있을까? 골드바흐의 추측이 4개의 소수의 합 정도라는 것 까지 증명된 것은 역시 이 골드바흐 추측 코드의 군데군데를 다시 세분화하고, 어느 정도의 것들은 기존의 증명된 논리(즉 함수)를 가지고 만들어 낸게 아닌가?

 

이미 형식체계의 불완전성이나 코드의 정상유무를 완전히 밝히는 것이 불가능하다는 것은 증명되었으나, 이러한 코드화 가능한 절차를 분할하고 개별로 증명하여 전체를 자동증명 어떤 시도가 있었던 것은 아니다. 혹은 기존의 증명을 통해 어떤 코드 들의 검사가 n이 무한일때 모두 완전하다고 하면 해당 코드의 조합으로 만드는 모든 것은 증명이 완료된 것이 아닌가? AI가 다양하게 사용되는 이때에 이런 종류의 수학과의 협업이 가능하지 않을까 상상해본다.

 

https://infomath.tistory.com/

반응형
Posted by 작동미학