Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AIアプリ Dojo #1 [入門者歓迎] GPUを活用して生成系AIに触れてみよう

AIアプリ Dojo #1 [入門者歓迎] GPUを活用して生成系AIに触れてみよう

https://ibm-developer.connpass.com/event/285217/ のセッション資料です。

生成系AIが一般に広まりつつある中で、企業内で独自の生成系AIを動かせる環境を作りたいというニーズが高まっています。 このセッションでは、NVIDIAのGPUを利用して、既存の生成系AIモデルを動かしてみる、という観点で、日本語での対話モデル、Stable Diffusionによる画像生成を実行するためにどうすればいいのか、モデルが実行される時にCPU、メモリ、GPUがどのように動くのかについて、デモを交えてご紹介します。加えて、IBM Cloudから利用できるGPUサーバーについてもご紹介します。

Akira Onishi (IBM)

June 15, 2023
Tweet

More Decks by Akira Onishi (IBM)

Other Decks in Technology

Transcript

  1. ೔ຊΞΠɾϏʔɾΤϜגࣜձࣾ ςΫϊϩδʔࣄۀຊ෦ ΧελϚʔɾαΫηε ϓϦϯγύϧɾϚωʔδϟʔ ݉ 8JOEPXT$POUBJOFS1PSUJOH1SPHSBNਪਐϦʔμʔ େ੢ জ "LJSB0OJTIJ!JCNDPN 5XJUUFS!POJBL

     IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ IUUQTXXXMJOLFEJODPNJOPOJBL "*ΞϓϦ %PKPୈճ <ೖ໳ऀ׻ܴ> (16Λ׆༻ͯ͠ੜ੒ܥ"*ʹ৮ΕͯΈΑ͏ 
  2. ࣗݾ঺հ 1SPQFSUZ 7BMVF ࢯ໊ େ੢ জ 5XJUUFS-JOLFE*O POJBL *5ۀքྺ ೥໨

    ϚΠϒʔϜ μΠΤοτ )BTI5BH ͍͍Ͷ͐੩Ԭੜ׆ ࠲ӈͷ໏ ౿·Εͯ΋ͳ্ཱ͓͕ͪΔಓͷ૲ Α͘࢖͏ٕ ೴಺ม׵Ͱࣗ෼ΛϙδςΟϒʹ IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ 'BDFCPPLʮ͓ʹ͋͘ʯͰݕࡧ
  3. "*ֶशͱ"*ਪ࿦Λ෼͚ͯߟ͑Α͏ "*ֶश Ϟσϧͷ࡞੒ɺվྑ "*ਪ࿦ ϞσϧΛར༻ͨ͠ܭࢉ ֶश σʔλ ਂ૚ֶश ʢܭࢉʣ ཧ࿦తͳԾઆɺݚڀɺ

    ࣮ূ͔Βͷཪ෇͚ େن໛ͳܭࢉࢿݯ )1$)JHI1FSGPSNBODF $PNQVUJOH "*Ϟσϧ "*ਪ࿦ʹదͨ͠ ίϯϐϡʔλʔ ඞཁͳ౤ࢿ "*ਪ࿦ʹదͨ͠ 04ɺϥϯλΠϜ "*ϞσϧΛ࢖ͬͨܭࢉ ϞσϧʹΑΔ࣮ݧɺݕূ "*ίϛϡχςΟͷϥΠϒϥϦΛར༻ͯ͠ ୯ମͰ΋࢝ΊΒΕΔ සൟʹߋ৽͕ൃੜ͢ΔલఏͰͷ ։ൃɾӡ༻͕ཧ૝త ϑΟʔυόοΫ ڊେͳσʔλϨΠΫϋ΢εɺ σʔλαΠΤϯςΟετɺ )1$؀ڥ΁ͷ౤ࢿ͕ඞཁ IUUQTIVHHJOHGBDFDP
  4. "*ਪ࿦ͷ࣮ߦ؀ڥ IUUQTQZQJPSH IUUQTIVHHJOHGBDFDP ίϯϐϡʔλʔ 8JOEPXT-JOVY04 1ZUIPO 1Z5PSDI ͳͲ $16 (16ϝϞϦ

    ϝϞϦ (16 ϝϞϦ (16ϝϞϦ /7.F 44% (16υϥΠό (1(16ԋࢉϥΠϒϥϦ "*ϞσϧΛར༻ͨ͠ΞϓϦ ϋʔυ΢ΣΞந৅ԽϨΠϠʔ )BSEXBSF"CTUSBDUJPO-BZFS $IJQ ηοτ /FUXPSL *OUFSGBDF طଘͷ"*Ϟσϧ ࢲ͕࣮ͨͪ૷͢Δਪ࿦༻ͷίʔυ "*ϞσϧΛ࢖ͬͨܭࢉ طଘͷϥΠϒϥϦ IUUQTXXXOWJEJBDPNKBKQ ిݯϢχοτ
  5. ߦྻͱϕΫτϧͷੵɺ̎ͭͷߦྻͷੵ 𝑎!! ⋯ 𝑎!" ⋮ ⋱ ⋮ 𝑎#! ⋯ 𝑎#"

    𝑝! ⋮ 𝑝" = ? 𝑎!! ⋯ 𝑎!" ⋮ ⋱ ⋮ 𝑎#! ⋯ 𝑎#" 𝑝!! ⋯ 𝑝!$ ⋮ ⋱ ⋮ 𝑝"! ⋯ 𝑝"$ = ? ͜ΕΒͷܭࢉࣗମ͸ɺ୯७ͳϧʔϓॲཧͰղܾͰ͖Δ O N Jͷ਺͕େ͖͘ͳΕ͹ɺ ܭࢉճ਺͸͞Βʹ૿͑Δ
  6. ྫ/7*%*"(F'PSDF359 https://www.gainward.com/main/vgapro.php?id=1162&lang=jp /7*%*""EB-PWFMBDFʢΤΠμɾϥϒϨεʣ "SDIJUFDUVSF https://www.nvidia.com/ja-jp/geforce/ada-lovelace-architecture/ 主なスペック トランジスタ数 763億 CUDA Core

    (シェーダプロセッサ) 数 16,384 Tensor Core数 512 RT Core数 128 GPU クロック 2.23GHz (ブースト時 2.52GHz) TDP 450W PCIe 4.0接続 https://www.4gamer.net/games/656/G065603/20221010003/
  7. 128GB/2 = 64GBを 共有GPUメモリとして利⽤ $16ɺ(16ɺͦΕͧΕͷϝϞϦ CPU AMD Ryzen 9 5950X

    DDR4 32GBメモリ DDR4 32GBメモリ DDR4 32GBメモリ DDR4 32GBメモリ ྫ೥݄ʹൃച͞Εͨ".%3Z[FO9ͱ(#%%3ϝϞϦɺ(16Λ૊Έ߹Θͤͨ৔߹ GPU NVIDIA GeForce RTX 4090 PCIe 4.0 x 16 GPU⽤GDDR6X 24GB メモリ
  8. ೔ຊޠಛԽͷݴޠϞσϧΛ࣮ߦͯ͠ΈΔ ؀ڥ8JOEPXT1SP 1ZUPSDI $6%" /7*%*"(F'PSDF359 (#ϝϞϦ ؀ڥ8JOEPXT4FSWFS 1ZUPSDI $6%" /7*%*"5FTMB5

    (#ϝϞϦ ԯύϥϝʔλ೔ຊޠର࿩(15ݴޠϞσϧ IUUQTIVHHJOHGBDFDPSJOOBKBQBOFTFHQUOFPYCJOTUSVDUJPOTGU
  9. import torch import time from transformers import AutoTokenizer, AutoModelForCausalLM prompt_base

    = "ユーザー: {}<NL>システム: " start = time.perf_counter() tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False) end = time.perf_counter() print("Tokenizer loaded:"+str(end-start)) start = time.perf_counter() model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft") #GPUメモリが12-16GBの場合、float16でなんとかメモリ内に収める #model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", torch_dtype=torch.float16) end = time.perf_counter() print("CausalLM loaded:"+str(end-start)) if torch.cuda.is_available(): model = model.to("cuda") print ("cuda is available") def encoding(prompt): start = time.perf_counter() token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt") with torch.no_grad(): output_ids = model.generate( token_ids.to(model.device), do_sample=True, max_new_tokens=256, temperature=0.9, top_k=50, repetition_penalty=1.0, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id ) output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):]) output = output.replace("<NL>", "¥n") end = time.perf_counter() print("Encoding completed:"+str(end-start)) return output #続き def do_conversation(): text = input("Neox-3.6b>") if text == "end": return False prompt = prompt_base.format(text) result = encoding(prompt) print(result) return True while True: res = do_conversation() if res == False: break
  10. *#.$MPVE(164FSWFS ϕΞϝλϧ (16ֹ݄՝ۚ /7*%*"5 1 7 Ծ૝Ϛγϯ 71$(FO  (16࣌ؒ՝ۚ

    /7*%*"7 ಛผ஫จʹΑΓ" ୆ߏ੒ ͷఏڙ͋Γ ˞ৄࡉ͸4VQQPSU$BTFͰ͓໰͍߹Θ͍ͤͩ͘͞ https://www.ibm.com/cloud/gpu
  11. ϫʔΫγϣοϓɺηογϣϯɺ͓Αͼࢿྉ͸ɺ*#.·ͨ͸ηογϣϯൃදऀʹΑͬͯ४උ͞ΕɺͦΕͧΕಠࣗͷݟղΛ൓өͨ͠΋ͷͰ͢ɻͦΕΒ͸৘ใ ఏڙͷ໨తͷΈͰఏڙ͞Ε͓ͯΓɺ͍͔ͳΔࢀՃऀʹରͯ͠΋๏཯త·ͨ͸ͦͷଞͷࢦಋ΍ॿݴΛҙਤͨ͠΋ͷͰ͸ͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉ΋ ͷͰ΋͋Γ·ͤΜɻຊߨԋࢿྉʹؚ·Ε͍ͯΔ৘ใʹ͍ͭͯ͸ɺ׬શੑͱਖ਼֬ੑΛظ͢ΔΑ͏౒ྗ͠·͕ͨ͠ɺʮݱঢ়ͷ··ʯఏڙ͞Εɺ໌ࣔ·ͨ͸҉ ࣔʹ͔͔ΘΒ͍͔ͣͳΔอূ΋൐Θͳ͍΋ͷͱ͠·͢ɻຊߨԋࢿྉ·ͨ͸ͦͷଞͷࢿྉͷ࢖༻ʹΑͬͯɺ͋Δ͍͸ͦͷଞͷؔ࿈ʹΑͬͯɺ͍͔ͳΔଛ֐ ͕ੜͨ͡৔߹΋ɺ*#.͸੹೚ΛෛΘͳ͍΋ͷͱ͠·͢ɻຊߨԋࢿྉʹؚ·Ε͍ͯΔ಺༰͸ɺ*#.·ͨ͸ͦͷαϓϥΠϠʔ΍ϥΠηϯεަ෇ऀ͔Β͍͔ͳ Δอূ·ͨ͸ද໌ΛҾ͖ͩ͢͜ͱΛҙਤͨ͠΋ͷͰ΋ɺ*#.ιϑτ΢ΣΞͷ࢖༻Λنఆ͢Δద༻ϥΠηϯεܖ໿ͷ৚߲Λมߋ͢Δ͜ͱΛҙਤͨ͠΋ͷͰ ΋ͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉ΋ͷͰ΋͋Γ·ͤΜɻ ຊߨԋࢿྉͰ*#.੡඼ɺϓϩάϥϜɺ·ͨ͸αʔϏεʹݴٴ͍ͯͯ͠΋ɺ*#.͕Ӧۀ׆ಈΛߦ͍ͬͯΔ͢΂ͯͷࠃͰͦΕΒ͕࢖༻ՄೳͰ͋Δ͜ͱΛ҉ࣔ ͢Δ΋ͷͰ͸͋Γ·ͤΜɻຊߨԋࢿྉͰݴٴ͍ͯ͠Δ੡඼ϦϦʔε೔෇΍੡඼ػೳ͸ɺࢢ৔ػձ·ͨ͸ͦͷଞͷཁҼʹج͍ͮͯ*#.ಠࣗͷܾఆݖΛ΋ͬ ͍ͯͭͰ΋มߋͰ͖Δ΋ͷͱ͠ɺ͍͔ͳΔํ๏ʹ͓͍ͯ΋কདྷͷ੡඼·ͨ͸ػೳ͕࢖༻ՄೳʹͳΔͱ֬໿͢Δ͜ͱΛҙਤͨ͠΋ͷͰ͸͋Γ·ͤΜɻຊߨ

    ԋࢿྉʹؚ·Ε͍ͯΔ಺༰͸ɺࢀՃऀ͕։࢝͢Δ׆ಈʹΑͬͯಛఆͷൢചɺച্ߴͷ޲্ɺ·ͨ͸ͦͷଞͷ݁Ռ͕ੜ͡Δͱड़΂Δɺ·ͨ͸҉ࣔ͢Δ͜ͱ Λҙਤͨ͠΋ͷͰ΋ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉ΋ͷͰ΋͋Γ·ͤΜɻύϑΥʔϚϯε͸ɺ؅ཧ͞Εͨ؀ڥʹ͓͍ͯඪ४తͳ*#.ϕϯνϚʔΫΛ࢖༻͠ ͨଌఆͱ༧ଌʹج͍͍ͮͯ·͢ɻϢʔβʔ͕ܦݧ͢Δ࣮ࡍͷεϧʔϓοτ΍ύϑΥʔϚϯε͸ɺϢʔβʔͷδϣϒɾετϦʔϜʹ͓͚ΔϚϧνϓϩάϥ ϛϯάͷྔɺೖग़ྗߏ੒ɺετϨʔδߏ੒ɺ͓Αͼॲཧ͞ΕΔϫʔΫϩʔυͳͲͷߟྀࣄ߲ΛؚΉɺ਺ଟ͘ͷཁҼʹԠͯ͡มԽ͠·͢ɻ͕ͨͬͯ͠ɺ ݸʑͷϢʔβʔ͕͜͜Ͱड़΂ΒΕ͍ͯΔ΋ͷͱಉ༷ͷ݁ՌΛಘΒΕΔͱ֬໿͢Δ΋ͷͰ͸͋Γ·ͤΜɻ هड़͞Ε͍ͯΔ͢΂ͯͷ͓٬༷ࣄྫ͸ɺͦΕΒͷ͓٬༷͕ͲͷΑ͏ʹ*#.੡඼Λ࢖༻͔ͨ͠ɺ·ͨͦΕΒͷ͓٬༷͕ୡ੒ͨ݁͠Ռͷ࣮ྫͱͯࣔ͠͞Εͨ ΋ͷͰ͢ɻ࣮ࡍͷ؀ڥίετ͓ΑͼύϑΥʔϚϯεಛੑ͸ɺ͓٬༷͝ͱʹҟͳΔ৔߹͕͋Γ·͢ɻ *#.ɺ*#.ϩΰɺJCNDPNɺ*#.$MPVEɺ*#.$MPVE1BLT͸ɺੈքͷଟ͘ͷࠃͰొ࿥͞Εͨ*OUFSOBUJPOBM#VTJOFTT.BDIJOFT$PSQPSBUJPOͷ঎ඪͰ͢ɻ ଞͷ੡඼໊͓ΑͼαʔϏε໊౳͸ɺͦΕͧΕ*#.·ͨ͸֤ࣾͷ঎ඪͰ͋Δ৔߹͕͋Γ·͢ɻݱ࣌఺Ͱͷ*#.ͷ঎ඪϦετʹ͍ͭͯ͸ɺ XXXJCNDPNMFHBMDPQZUSBEFTIUNMΛ͝ཡ͍ͩ͘͞ɻ .JDSPTPGU 8JOEPXT 8JOEPXT4FSWFS /&5'SBNFXPSL /&5 /&5$PSF͸ɺ.JDSPTPGU$PSQPSBUJPOͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ /7*%*" /7*%*"ϩΰ /7*%*"$6%"͸ /7*%*"$PSQPSBUJPOͷͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ