다른 도메인에 맛집 기록이랑 일기 쓴다고 바빠져서 + 귀찮음 / github블로그로 옮길까 고민하며

티스토리 블로그는 버려둔지 오래..

 

이런 상황에서 공부 기록용 티스토리 블로그를 찾지 않을 수가 없는 대 사건이 일어난다

이름하여 chatGPT 열풍,,

 

그 시작은 연구실에서 어느날 얼리어답터인 어떤 선배가 chatGPT라는게 나왔고 

그걸 검색엔진으로 만들수 있는 확장이 나와서 써봤다 ~~ 하는 얘기를 들은것 !

첨 듣고는 그렇구나 ~ 하고 넘겼는데 어느 주말 개인 공부하다 찾아보니,, 

이거 진짜 대박이구나,, 싶어서 기록으로 남겨야 겠다는 생각이 들었다  

 

chatGPT가 등장한지도 벌써 근 3달이 다되간다. (22.11.30 개시)

https://openai.com/blog/chatgpt/

 

ChatGPT: Optimizing Language Models for Dialogue

We’ve trained a model called ChatGPT which interacts in a conversational way. The dialogue format makes it possible for ChatGPT to answer followup questions, admit its mistakes, challenge incorrect premises, and reject inappropriate requests. ChatGPT is

openai.com

 

GPT야 워낙에 대단하다는 걸 알아왔지만 챗GPT는 내가 느끼기엔 새로운 인터넷의 등장이 아닐까 싶다

예전에 어느 전문가가 "AI는 4차 산업혁명 시대의 새로운 전기다"라는 말을 한걸 들었는데

이제는 chatGPT가 4차 산업혁며 시대의 새로운 전기다 라고 해야하지 않을까? 

 

주변 직장인들 말을 들어보면 갑자기 교육에, 인사에, 마케팅에, 기획에 딥러닝을 접목해보라고 했다는 오더들이 내려왔다 하고,

주식만 봐도 chatGPT 관련주 열풍에 (엔비디아, 로블록스, 메타, 국내 메타버스 주들 등등)

뉴스만 봐도 대통령이 chatGPT에 관한 특별 지시들과 신년인사를 chatGPT로 써보았다는 뉴스가 있다

 

https://mobile.newsis.com/view.html?ar_id=NISX20230127_0002171728#_enliple 

 

尹 "챗GPT, 오랜 조력자같은 문장"…참모들은 미래기술 '열공' 중

[서울=뉴시스] 양소리 기자 = "윤석열 대통령이 최근 신생 챗봇 챗GPT(ChatGPT)를 이용한 뒤 상당히 깊은 관심을 보이고 있다

mobile.newsis.com

 


개인적으로 챗GPT에 느꼈던 점을 이래저래 써보면 

우리나라에서 랭귀지 딥러닝 모델이 이렇게나 주목받았다는 점이 신기하다는 것이다.

 

우리나라 및 기타 아시아 국가들은 비전쪽 연구를 찍어내고 

미국을 포함한 북미, 영미권 국가들은 NLP, speech등의 연구를 주로 하는 느낌이고,

실제로 서울대에도 비전딥러닝을 하는 연구실은 많지만 상대적으로 음성딥러닝을 하는 곳은 적다.

 

내가 생각하는 이유는 물론 네이버, LG 등이 한국어 초거대 언어 모델을 만들려고 노력을 많이 하고 있으나,

"한국어"라는 단일언어로는 영미권 국가들 처럼 대규모로 데이터셋을 몹거나 자본을 투자할 수 없으니 

영어를 바탕으로 하는 나라에서 당연히 NLP 연구가 더욱 조직적으로, 주도적으로 일어나고 있다는 것이다.

(물론 어깨너머로 보기엔 LG, 네이버 모두 크나큰 투자를 하고 있지만)

 

  우선 그래서 우리나라에서는 수익화를 위한 것이 아닌, 학문을 위한 NLP 연구는 잘 주목 받지 못하겠지? 라는 생각을 갖고 있었는데

(이유가 뭐가됐던) NLP 모델이 이렇게 큰 파장을 불어 왔으니, 우리나라에서도 이제 Language 모델이 더더욱 발전하려나? 하는 기대감이 생기게 된 것 같다. 

 

chatGPT를 이용하면 이제 왠만한 메일도 자기손으로 쓰는 사람이 없을 것이고, 

현재 우려하는 바대로 대학 과제 등등에서 과연 chatGPT를 가려낼 수 있을까하는 생각이 든다. 

 


다만 여러가지 의미로 chatGPT는 "정말로" 인터넷이라고 생각하는 것이 

내가 생각하는 chatGPT의 단점은 크게 두가지이다.

"신뢰성"과 "공정성".

 

사실 공정성은 단순히 학문적인 궁금증, 더 나아가서 내가 AI에 대해 근본적으로 갖고 있는 궁금증 중에 하나의 이야기이니 

짧게 아래 다른 분의 게시글로 대체하도록 하고 

 

https://m.blog.naver.com/PostView.naver?blogId=darksun1998&logNo=223010626046&proxyReferer= 

 

ChatGPT 탈옥 이슈

그 동안 공돌이들이 미래를 더 생산적이고 희망차게 만들기 위하여, 시간과 노력과 돈을 갈아넣어 AI를 ...

blog.naver.com

 

한마디로 정리하자면 large dataset을 사용하는 것은 좋으나 이것이 "어디까지 abusing 방지가 되어야 하는가"이다.

기존의 국내의 이루다, MS의 테이 등이 수많은 어택으로 abusing이나 차별발언을 막지 못하여 서비스 종료한 사건들이 있었다. 

(이제보니 MS가 테이의 아픔으로 abusing을 굉장하게 처리해서 chatGPT를 내놓았나 싶다)

 

이러한 단순 어택의 문제는 AI의 문제라기 보단 사용자들의 문제이니 패스하고, 

내가 궁금한건 결국 이러한 초거대 AI 모델을 만들기 위해 초거대 dataset을 사용해야 할 것이고,

초거대 dataset을 사용하는 이상 정제되지 않은 데이터를 사용하는 것이 지금으로서는 불가피할 것인데 

과연 정제되지 않은 dataset의 bias를 딥러닝은 얼마만큼 허용해야 할까?

 

사람들과 사회가 고정관념을 갖고 있는 것은 사실인데 그러한 편견과 고정관념을 AI역시 배워야할까? 

배우지 않도록 하는 것이 오히려 더 문제 아닌가? 

둘 사이의 절충안이 있어야한다면 어떻게 파라미터 튜닝을 해야할까? 하는 것들이 궁금증으로 남게 된다. 

 

 


공정성은 나 하나의 궁금증에 가깝다면 

신뢰성은 chatGPT가 가장먼저 넘어야할 산에 가깝다. 

 

실제로 내 주변 직장인들 중 사무업무를 보는 사람들은 

위에선 GPT로 뭔가 통계 자료를 내거나 사무보조 하는 방법에 대해 논의 하고 있는데

사실 GPT가 대답하는 통계 자료는 레퍼런스가 없으니 쓸수가 없다 라는 고충을 토로한다 .

 

챗GPT로 받은 대답을 바로 업무에 사용하는 것은 마치 나무위키를 레퍼런스로 과제를 하는 것과 같지 않을까 생각해본다

어디서 보기 힘든 다양하고 세세한 정보를 얻을 수 있고 높은 확률로 크로스체크가 되어 맞는 정보이겠지만,

아무도 그것을 레퍼런스로 보고서를 쓰지 않는다.  위험부담이 너무 크고, 공적인 신뢰도가 너무 떨어지기 때문이다. 

 

이러한 점을 생각해보면 결국 chatGPT던 AI던 현재 상상할 수 있는 수준에서는 

인간을 대체한다기보단 인간의 보조 역할로 거듭나는게 맞나? 하는 결론이 나기도 한다. 

(사실 많은 인간들이 이것을 바라는 것 같기도 하고)

 

 

단순 의견을 적는 글이라 정돈 되지 않은 글이지만 

10년동안의 가장 혁신적인 기술로 추앙되는 chatGPT 열풍이 식기 전에 빠르게 

지금 드는 생각을 적어보고 싶었다 !

 

오늘의 일기 끝. 

 

상황: 현재 AI 이용한 손글씨 인식 챌린지를 참여중인데 (순위가 out of domain,,,)  train test set의 domain이 다른게 

결국 문제인 것 같아 간단하게 domain adaptation 공부하면서 요약 중

상황: test set(=target domain)은 이미지만 있고 label은 없는 상황

validation  set accu는 97%인데 test set accu는 82% (ㅜㅜ)

 

* domain adaptation은 결국 transfer learning의 한 종류이다

 

* target domain의 labeling에 따라 4가지 종류로 나눌 수 있다

  1. Supervised DA
  2. Semi-Supervised DA
  3. Weakly Supervised DA
  4. Unsupervised DA

=> 그중 내 setting 은 4번

 

Unsupervised Domain Adaptation by Backpropagation(2015)

: backprop의 구조만 약간 바꿈

'딥러닝 공부 > 짧은 AI' 카테고리의 다른 글

t-sne 요약  (0) 2023.09.10
Representation Learning  (0) 2022.08.18

pytorch만 쓰다가 visualization의 한계를 깨닫고 tensorboard 툴 공부 중,,,

여차저차해서 tensorboard 코드는 만들었는데, 

코드 실행하는 server는 linux 기반의 ubuntu, 노트북은 macOS, 테스크탑은 window 기반이라 tensorboard 연결하면서 겪은 약간의 시행착오를 정리하려고 한다. 

 

일단 macOS에서는 vscode를 사용하기 때문에 vscode로 연결한 원격 터미넣에서 아래처럼 tensorboard를 켠 후

tensorboard --logdir={log경로}

바로 http://{원격ip주소}:6006을 (6006은 포트 설정 안했을 시 기본설정) 크롬에 입력하면 tensorboard 창이 켜졌다.

 

문제는 window에서는 vscode를 사용하지 않고 모바엑스텀을 사용해서,,,똑같이 하니까 안되더라

검색해본 결과

1. 원격서버에서 포트 지정해서 tensorboard를 열 것(근데 필수는 아님)

2. window cmd에서 NfL로 원격서버와 로컬 연결하기

3. window 크롬에서 주소 입력하기 

 

이렇게 세 단계로 나눠서 하면되는 걸 파악했다. 그러니까 2번 단계가 추가된 것!

 

1. 원격서버에서 아래같이 원격포트번호를 지정해준다. 

이는 실제 원격 서버의 포트번호가 아니라, 텐서보드를 다른사람이 쓰고 있거나 6006을 다른 사람이 쓰고 있는 경우를 방지하기 위해서이다. 나같은 경우는 6007로 진행하였다.

 

tensorboard --logdir {log 폴더 경로} --port {원격포트번호지정}

 

 

2. window에서 cmd에 ssh 클라이언트 기능을 설치한다. 

윈도우 설정 -> 앱 -> 선택적 기능 -> ssh 클라이언트

를 찾아 설치하면 1분도 안걸린다. 

 

그 다음 윈도우 + R 키로 윈도우 cmd 창을 연다 (주의: anaconda prompt 아님!)

ssh -NfL localhost:{local에서 쓸포트번호}:localhost:{원격포트번호} {원격id}@{원격ip}
# or 원격 서버를 연결하기 위한 포트번호가 있을 시
ssh -NfL localhost:{local에서 쓸포트번호}:localhost:{원격포트번호} {원격id}@{원격ip} -p {원격기본설정 포트}

그 다음 위 커맨드를 쳐서 원격서버와 로컬서버의 포트번호를 연결해준다

이때 주의점은 {원격포트번호}와 {원격기본설정 포트}는 다르다는 점이다.

(이걸 검색해서 여기까지 온사람이라면 차이를 알겠지만 혹시나,,,)

 

# {local에서 쓸 포트번호}

아무거나 내 로컬에서 사용하지 않는 포트번호로 지정해주면 된다. -> 이값을 3번에서 사용할 예정

 

# {원격포트번호}

나같은 경우는 {원격포트번호}에 1번에서 지정해준 6007을 썼고, 

1번에서 포트 번호 지정은 안했다면 6006을 사용하면 된다. 

 

# {원격기본설정 포트}

이는 원격 서버에 설정된 포트 번호가 있다면 지정해주면 된다. 보통 22로 설정되어 있는 그 포트번호 말하는 것이다.

6006과는 아무 상관이 없다. 원격서버에 포트 설정이 안되어 있다면 입력할 필요 없다. 

 

 

3. window 크롬에서 주소 입력하기 

window 로컬컴에서 

http://{원격서버ip}:{local에서 쓸 포트번호}

를 주소창에 입력해주면 된다.

 

 

## 정리

# 원격에서
tensorboard --logdir {log 폴더 경로} --port {A}

# 로컬 window cmd에서 (C는 원격서버 포트 번호가 22(기본설정값)이 아닐 시)
ssh -NfL localhost:{B}:localhost:{A} {원격id}@{원격ip} -p {C}

# 로컬 window 주소창에서
http://{원격서버ip}:{B}

Nvidia 에서 만든 data loading library인 DALI 공부 중

n년전 pytorch가 그랬듯, 툴 자체는 좋아보이는데 아직 사용자가 많지 않은지 error에 대한 정보를 얻기가 힘들다 ㅜ

일단 현재까지 파악한 건,

 

- TF 처럼 define and run 구조. -> 따라서 random 성이 있는 모듈은 구현되어 있지 않음

- pipe를 define할때는 transform을 추가하고, run할 때 transform에 들어갈 변수들을 parameter로 전달

ex. define할때 crop이 들어가면 run할때 crop size를 넣어줌 

 

=> 기본적으론 아래와 같이 돌아가고, custom dataset에서는 어떻게 줘야하는지 자꾸 오류가 나서

     일단 Nvidia측에서 제공하는 dataset으로 이것저것 실험 중

 

=> ToDo: crop 등등 transform하기 / CPU, GPU Mixed 성능비교하기 / torch랑 학습 시간 비교하기


DALI 공식문서

https://docs.nvidia.com/deeplearning/dali/user-guide/docs/

 

NVIDIA DALI Documentation — NVIDIA DALI 1.18.0 documentation

Multiple data formats support - LMDB, RecordIO, TFRecord, COCO, JPEG, JPEG 2000, WAV, FLAC, OGG, H.264, VP9 and HEVC.

docs.nvidia.com

Nvidia에서 DALI repo에 제공하는 dataset

https://github.com/NVIDIA/DALI/tree/main/docs/examples/data/images

 

GitHub - NVIDIA/DALI: A GPU-accelerated library containing highly optimized building blocks and an execution engine for data pro

A GPU-accelerated library containing highly optimized building blocks and an execution engine for data processing to accelerate deep learning training and inference applications. - GitHub - NVIDIA/...

github.com

# 돌리는데 성공한거

def simple_mixed_pipeline():
    jpegs, labels = fn.readers.file(file_root=data_dir)
    images = fn.decoders.image(jpegs, device="mixed")

    return images, labels


if __name__ == "__main__":
    pipe = simple_mixed_pipeline(batch_size=8, num_threads=2, device_id=0)
    start = time()
    pipe.build()
    pipe_out = pipe.run()
    end = time()
    print(pipe_out)
# 앞으로 돌려봐야할 것

from nvidia.dali.pipeline import Pipeline
from nvidia.dali import pipeline_def
import nvidia.dali.fn as fn
import nvidia.dali.types as types
from nvidia.dali.plugin.pytorch import DALIGenericIterator

import torchvision.models as models
resnet18 = models.resnet18()

from time import time

data_dir = "./test_DALI/images/"


@pipeline_def(batch_size=128, num_threads=4, device_id=0)
def get_dali_pipeline(data_dir, crop_size):
  images, labels = fn.readers.file(file_root=data_dir)
  # decode data on the GPU
  images = fn.decoders.image_random_crop(images, device="mixed", output_type=types.RGB)
  # the rest of processing happens on the GPU as well
  images = fn.resize(images, resize_x=crop_size, resize_y=crop_size)
  images = fn.crop_mirror_normalize(images,
                                    mean=[0.485 * 255,0.456 * 255,0.406 * 255],
                                    std=[0.229 * 255,0.224 * 255,0.225 * 255],
                                    mirror=fn.random.coin_flip())
  return images, label


train_data = DALIGenericIterator(
   [get_dali_pipeline(data_dir, (224, 224))], ['data', 'label'], reader_name='Reader')


for i, data in enumerate(train_data):
  x, y = data[0]['data'], data[0]['label']
  pred = resnet18(x)
  # loss = loss_func(pred, y)
  # backward(loss, model)

+ Recent posts