Ruby에서 GPT-2로 텍스트 생성



소개



많은 사람들이 Python 이외의 언어에서 AI에 액세스하는 것이 너무 어렵다고 생각합니다. 하지만 최근에는 사전 학습된 모델이 많이 공개되어 다양한 플랫폼과 프로그래밍 언어에서 AI 추론을 쉽게 실행할 수 있습니다. 여기서는 ONNX 런타임을 실행하고 Ruby 언어에서 영어 문장을 생성하는 GPT-2 모델을 사용해 보려고 합니다. ONNX Runtime을 사용하면 쉽게 추론할 수 있습니다.

준비 및 설치



다음 3개의 gem을 설치합니다.

  • onnxruntime - ONNX 런타임용 Ruby 바인딩.

  • tokenizers - Hugging Face에서 제공하는 토크나이저용 Ruby 바인딩.

  • numo-narray - 루비 매트릭스 라이브러리. NumPy와 동일합니다.

  • gem install onnxruntime
    gem install tokenizers
    gem install numo-narray
    


    onnxruntime gem에는 이미 각 플랫폼에 대한 바이너리 파일이 포함되어 있으므로 ONNX 런타임을 직접 설치할 필요가 없습니다. gem을 설치하기만 하면 작동합니다.

    tokenizers gem은 Rust로 작성되었으므로 설치하려면 Rust가 필요합니다. Rust를 사용할 수 없는 경우 blingfireused이 될 수 있습니다.

    또한 단수형 "tokenizer"는 다른 gem입니다.

    ONNX 모델 가져오기



    여기서는 ONNX 관계자가 배포한 GPT-2 모델을 사용합니다. link에서 GPT-2-LM-HEAD를 다운로드합니다.



    위 화면에서 마우스 오른쪽 버튼을 클릭하여 다운로드를 시도하면 링크 대상이 html이기 때문에 실패합니다. 링크를 한 번 클릭하고 다음 페이지의 오른쪽 상단에 있는 다운로드 버튼에서 모델을 다운로드합니다.



    스크립트와 동일한 디렉터리에 gpt2-lm-head-10.onnx를 넣습니다. NETRON 을 사용하여 ONNX 모델의 콘텐츠를 찾아볼 수 있습니다.

    코드 작성



    준비 되었나요? 이제 Ruby 코드를 작성해 보겠습니다.

    require "tokenizers"
    require "onnxruntime"
    require "numo/narray"
    
    s = "Why do cats want to ride on the keyboard?"
    
    # Prepare a tokenizer.
    tokenizer = Tokenizers.from_pretrained("gpt2")
    
    # Load the model.
    model = OnnxRuntime::Model.new("gpt2-lm-head-10.onnx")
    
    # Convert string to matrix.
    ids = tokenizer.encode(s).ids
    
    # Get 10 words.
    10.times do
      o = model.predict({ input1: [[ids]] })
      o = Numo::DFloat.cast(o["output1"][0])
      ids << o[true, -1, true].argmax
    end
    
    # Print the result. Array to string.
    puts tokenizer.decode(ids)
    


    다음 코드는 많은 Ruby 사용자에게 생소할 것입니다. NumPy와 유사한 라이브러리인 numo-narray를 사용합니다. numo-narray로 무엇을 할 수 있는지 더 알고 싶다면 를 참조하십시오.

      o = Numo::DFloat.cast(o["output1"][0])
      ids << o[true, -1, true].argmax
    


    사실 저는 행렬 연산이 무엇을 하는지 정확히 이해하지 못합니다. NumPy 코드를 numo-narray로 변환하는 중입니다. 그러나 다른 한편으로 공개적으로 사용 가능한 AI 모델을 사용하기 위해 AI 또는 수학에 익숙할 필요는 없습니다. 스스로 수리하지 않고 차를 운전할 수 있는 것과 같습니다.

    운영


    ruby gpt2.rb
    Why do cats want to ride on the keyboard?
    
    The answer is that they do.
    


    이번에는 웹상에서 API를 호출하는 것이 아니라 실제로 머신에서 딥러닝을 실행했습니다. Ruby에서 딥러닝 모델을 호출하는 것이 생각보다 쉬웠기를 바랍니다.

    Ruby 컴퓨팅을 즐기십시오. 좋은 하루 되세요!


    확률적으로 단어 선택



    위의 구현은 가장 가능성이 높은 단어를 선택합니다. 단어 선택을 더 확률적으로 하려면 다음과 같이 할 수 있습니다.

    def softmax(y)
      Numo::NMath.exp(y) / Numo::NMath.exp(y).sum(1, keepdims: true)
    end
    



      outputs = @model.predict({ input1: [[ids]] })
      logits = Numo::DFloat.cast(outputs['output1'][0])
      logits = logits[true, -1, true]
    
      log_probs = softmax(logits)
      cum_probs = log_probs.cumsum(1)
      r = rand(0..cum_probs[-1]) # 0..1
      (cum_probs < r).count
    


    GUI를 추가하는 방법











    Andy Obtiva(코드 마스터)









    LibUI 0.5.23용 Glimmer DSL은 새로운 메모장 샘플과 함께 제공됩니다(작업 기반). 입력한 모든 텍스트의 연속을 예측할 수 있는 텍스트 예측기입니다. 자세히 알아보기: github.com/AndyObtiva/gli… twitter.com/RubygemsN/stat…


    오후 18:44 - 2022년 9월 10일





    rubygems_news

    @RubygemsN

    glimmer-dsl-libui(0.5.23): LibUI용 Glimmer DSL(전제 조건이 없는 Ruby Desktop Development GUI 라이브러리) - Fukuoka R https://t.co/CA3Czg02I8 우승자

    좋은 웹페이지 즐겨찾기