라벨이 etc인 게시물 표시

DSTC 10 - Track 3

이미지
소개 https://sites.google.com/dstc.community/dstc10/tracks?authuser=0 SIMMC 2.0: Situated Interactive Multimodal Conversational AI https://github.com/facebookresearch/simmc2 https://arxiv.org/pdf/2104.08667.pdf 4 Task Formulation SIMMC 2.0 데이터 세트의 목표는 인간이 자리 잡은 다중 모드 컨텍스트에 기반한 자연어 대화 에이전트와 대화하는 미래의 실제 쇼핑 시나리오를 모방하는 것입니다. 이 지능형 대화 에이전트를 향한 한 걸음으로, 우리는 데이터 세트의 대화와 주석을 활용하고 평가 지표와 함께 4 개의 벤치 마크 작업 (표 3에 요약 됨)을 제안합니다. 이러한 작업은 다음에 자세히 설명 할 여러 가지 대화식 추론 과제를 포착합니다. 4.1 Multimodal Disambiguation 실제 대화 세계에서, 사람들은 대화에서 이미 언급된 objects / evenets을 참조하기 위해, 종종 공동참조를 사용한다. 우리는 Sec. 4.2에서 챌린지 테스크로써 coreference resolution을 모델링하는 것을 예약한다. 이것은 시스템이 이러한 상호 참조를 해결하려고 시도하기 전에 ambiguous 사용을 인식하는 것이 중요하다. 예를 들어, ‘A: The blue trouser is priced at $45. U: What about those?’, 에서 phrease those  는 따라오는 situation에서 ambiguous할 수 있다. (a) 사용자가 염두에 두고 있는 정확한 것을 특정하지 않고 바지들의 그룹을 참조하는 경우 (예시에서 여기 있는 것들은 얼마에요? 라는 느낌) (b) 사용자가 대화의 간결함 때문에 대화속에서 언급되지 않은 바지의 새로운 쌍에 대한 줄임말을 잘못 사용한 경우 (예시에서 이거는 얼마에요? 라는 느낌) 두 케이스 모두, di...

HuggingFace Transformer

갑자기 궁금해서 찾아본 내용임 Transformer 라이브러리를 불러다가 pretrained 모델을 활용할 때, 특수 토큰 임베딩을 어떻게 주나 궁금했음. Transfertransfo에서 이런 기법을 활용했기 때문에 궁금한 거였고 그 모델의 깃헙이랑 아래 링크를 찾아보았음 https://huggingface.co/transformers/model_doc/gpt2.html https://huggingface.co/transformers/model_doc/gpt2.html Transformer 중 GPT 모델 기준으로 살펴보았다. 입력은 다음과 같이 인자들을 받게 된다. input_ids = None , past = None , attention_mask = None , token_type_ids = None , position_ids = None , head_mask = None , inputs_embeds = None , use_cache = None , output_attentions = None , output_hidden_states = None , 여기서 input_ids는 자주 쓰는 입력 토큰 ids임 보통은 이것만 넣으면 되긴 함 때때로 position embedding의 방법을 바꾸고 싶으면 position_ids을 바꾸면 됨. default가 다음과 같음. if position_ids is None : device = input_ids . device if input_ids is not None else inputs_embeds . device position_ids = torch . arange ( past_length , input_shape [ - 1 ] + past_length , dtype = torch . long , device ...

모델 학습 중에 갑자기 out-of-memory 발생

(pytorch 상황에서 설명) 최근에 모델을 학습하는데, 중간에 CUDA out-of-memory 에러가 발생했다. 내가 코드를 잘못짰나? 살펴보았지만, 딱히 잘못짠 거 같지도 않고 잘못 구성했으면 초반부터 에러가 났어야할 것 같다. 딥러닝 배운지 얼마 안됐을때에도 비슷한 상황이 있었던 것 같은데.. 이 때는 내가 잘못짰고 GPU가 딸려서 그런가보다 하고 넘어갔던 거 같다. 아무튼 그래서 구글신에게 물어봤는데 비슷한 증상이 많다. 결론!! nvidia-smi 등으로 학습 중간에 메모리 사용량을 확인해보라고 한다. 확인해보니 매우 조금씩 점점 늘어나는 것이 아닌가? 또 누군가는 detach 함수를 써보라고 한다. detach를 쓰면 거기서 부터는 backprop이 일어나지 않도록 하는 것이다. 즉 업데이트할 필요없는 evaluation 부분이라든지 이런 부분을 detach 처리하라는 거다.  혹은 with torch . no_grad (): 을 쓰라는 것이다. 나하곤 크게 관련이 없을 것 같아서 더 찾아보니 del해서 메모리를 날리라는 글도 있다. 만약 loss = loss_calculate(output, label)이라고 하면 이것으로 loss.backward() 한 후, del loss 를 하라는 것이다. 또한 학습 중간에 torch.cuda.empty_cache() 을 하라고한다. 그러나 링크2에서 보듯이, 이 방법은 속도가 느려지기 때문에 효율적이지 않다는 것 같다. 왜 효율적이지 않을까 생각해보면 캐시에 있어서 학습에는 쓰이지 않아도 뭐 딴데 쓰인다고 했을 때, 그걸 empty_cache()로 날리면 다시 계산해야하니까 그런걸까? 즉 내 어디 부분이 cache인지 알면, no_grad로 묶으면 될 것 같은데 어디 부분지 잘 모르겠다면 그냥 간단히 empty_cache()도 한 방법일듯.. 내가 봤던 링크 https://discuss.pytorch.org/t/gpu-memory-consumption-increases-while-tra...

Pytorch Dataloader 알아보기 (+ various length 처리하기)

이미지
예전에 파이토치에서 코딩을 할 때는, dataloader 없이 그냥 로우하게 코딩했다. txt 파일이라하면, 그냥 txt파일 읽고, readlines으로 리스트 같은 곳에 저장해서 for문에서 하나씩 읽어서? 하는 느낌으로... 물론 batch 및 padding은 직접 짜주는 식으로 했다. 남의 코드 없이 밑바닥 부터 짜는 경우가 있어서 큰 상관은 없었으나.. 보통 오픈된 코드를 참고하고자 살펴보면 Dataloader을 쓰더라! 이것은 위와 같은 귀찮은 작업들을 class 함수로 짜주면 간단히 해결할 수 있다는 것이다. 이렇게 짜줄 때, sequence와 같은 경우 데이터 길이가 당연히 달라질 수 있는데 이것을 collate_fn을 이용해서 padding 처리할 수 있는 개념이 있다. 위의 설명은  https://hulk89.github.io/pytorch/2019/09/30/pytorch_dataset/ 에서 빠르게 익힐 수 있다. 부연설명하자면 아래와 같은 데이터세트가 있다고 하자. 데이터세트: 오픈된 한국 챗봇 데이터세트 아래와 같이 class을 짤 수 있다. 여기서 class을 선언할 때 __init__은 뭐 초기함수 개념이고 __len__은 데이터 길이를 출력 __getitem__이 핵심 함수로 데이터를 읽어 들이는 부분이다. 참고로 여기서 tokenizer은 BPE이다. 이것을 다음과 같이 일반적으로 사용이 가능하다. 근데 이렇게 쓰면, 데이터가 다양한 경우 처리가 안된다. 이를 찾아보면 collate_fn을 사용하라고 검색이 된다. 참고로 여기서 shuffle을 하는 방법으로 sampler가 있고 shuffle=True가 있는데 기본적으로 sampler은 데이터로드를 할 수 있는 여러 방법을 제시하는 것이다. 단순히 sample에 randomsampler을 쓰는것과 shuffle=True는 무슨 차이가 있는 거지? 따라서 various은 다음과 같이 처리가 가능하다. (위의 reference링크를 참고하여 짜보았다.)

HuggingFace 모델 manually 다운로드

이미지
NLP에서 Transformer 기반들의 모델들이 최근 대세를 이루고 있는데.. 내 기억의 시작은 다음과 같다.  BERT와 같이 구글에서 만드는 것은 텐서플로우 버전으로 제공된다. 근데 이때만 해도 TF 1점대 버전은 사용하기 불편한 점이 있고 코드를 정해진 downstream task는 매뉴얼대로 사용하면 되지만.. 자유자재로 손쉽게 사용하기에는 pytorch에 비해 뭔가 부족한 면이 있었다. 이 때 해성같이 등장한 huggingface가 파이토치 버전으로 컨버팅해주면서 급인기를 끌었다. 그 이후에 많은 관심이 쏠리면서, BERT 뿐만 아니라 Transformer 기반의 모든 모델을 컨버팅해서 올려주기 시작했다. 그러면서 유명한 논문들 뿐 아니라, 개인 모델?(예로 한국어BERT, Transformer기반 모델들)들도 converting 해주는 스크립까지 제공해주기까지 한다. 이 외에도 많은 기능들을 제공해주면서 손쉽게 pretrained 모델들을 사용하기에 엄청난 일조를 했다고 생각이든다. 어쨌든, 근데 회사 보안이라든지, 개인적인 이유로 가끔식 모델을 매뉴얼하게 저장해야하는 경우가 있었다. 대표적으로 2가지 방법이 있을 것 같은데.. 1) 오픈된 장소인 colab에서 huggingface 말대로 모델을 부르고  model.save_pretrained(save_path) tokenizer.save_pretrained(save_path) 로해서 save_path에 모델을 저장하는 법으로 다음과 같이 저장이 된다. 이것을 압축해서 구글드라이브 및 로컬장소로 다운받으면 된다. 2) 직접 url을 통해서 다운 받기 이 방법에 대해 스크립을 찾지는 못했으나 이것저것 정보를 짜집기하여 다음과 같이 결론을 내렸다. https://huggingface.co/transformers/_modules/index.html 위 사이트를 가면 여러가지 모델들이 있다. 다운받고 싶은 모델의 configuration을 클릭한다. openai-gpt을 예로 들면, 다음...

BERT에서 Mecab tokenization 코드

BERT에서 mecab tokenizer을 사용하여 pre-training와 fine-tuning을 실험했었다. - 물론 제대로 하려면 코퍼스와 비용이 많이 필요하기 때문에 간단히 샘플위주로 학습했었다. - 기존의 BERT은 BPE을 쓰기 때문에 sentence piece을 이용하여 한국어 코퍼스에 맞게 vocabulary와 tokenizer을 학습 및 구축해야한다. - 근데 mecab은 이미 구축된 tokenizer이고 mecab을 이용한 사전이 구축되어 있었기 때문에 그냥 mecab을 쓴 것도 있다ㅎㅎ 아무튼 이때 mecab을 이용해서 입력을 tokenization하는 코드를 짜야한다. - BERT의 tokenization.py을 다음과 같이 수정하는게 제일 쉽다. (물론 여러 방법이 있을 것이다. 이 부분은 고정하고 다른 부분을 수정하는 식 등) class   mecabTokenizer ( object ):    def   __init__ ( self ,  vocab_file ):      self .vocab = load_vocab(vocab_file)      self .inv_vocab = {v: k  for  k, v  in   self .vocab.items()}      self .joo_tokenizer=MeCab.Tagger( '-d /usr/lib/mecab/dic/mecab-ko-dic/' ).parse     def   tokenize ( self ,  text ):     text = text.strip()     split_tokens =...