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

クラウドの作り方(GPUサーバ編)

Hikaru Ashino
February 27, 2023

 クラウドの作り方(GPUサーバ編)

Hikaru Ashino

February 27, 2023
Tweet

More Decks by Hikaru Ashino

Other Decks in Technology

Transcript

  1. 2 • ୲౰ۀ຿ • αʔϏεͷόοΫΤϯυ։ൃɺΠϯϑϥ։ൃ • Ӵ੕σʔλϓϥοτϑΥʔϜʮTellusʢςϧʔεʣʯ • ͘͞ΒͷVPSɺ͘͞ΒͷΫϥ΢υ •

    ܦྺ • 2012 - 2016 ITܥઐ໳ֶߍ4೥՝ఔͰֶͿ ߴ౓ઐ໳࢜ଔ • 2013 - 2016 MSPͱϗεςΟϯάΛߦ͏ձࣾʹΞϧόΠτೖࣾ • OpenStackɺLinux KVMΛ༻͍ͨԾ૝؀ڥͷߏஙӡ༻ • OSSͰߏங͞ΕͨγεςϜͷӡ༻ɺτϥϒϧγϡʔςΟϯά • 2016 - ݱ৬ ͘͞ΒΠϯλʔωοτʹ৽ଔೖࣾ • 2017 - 2019 ܳज़ܥେֶӃʹͯ2೥ݚڀ͢Δ ܳज़ֶम࢜ @tar_xzvff
  2. GPUαʔό(ߴՐྗϓϥϯ)͕஀ੜ͢Δ͖͔͚ͬ • ӡ༻͍ͯ͠ΔதͰ͍͔ͭ͘՝୊͕͋ͬͨ • Kubernetes͕ಈ͘αʔό͸αʔϏεΛ·͕ͨΔ • αʔϏε͕ҟͳΔͨΊ࢓༷͕ҟͳΔ • APIͷ༗ແɺػೳͷ༗ແͷࠩɺΠϯϑϥ࢓༷ •

    αʔϏεؒΛϩʔΧϧ઀ଓ͢Δͷ͕൥ࡶ • Ϋϥ΢υ͸TerraformͰίϯτϩʔϧͰ͖ͨɺͦΕҎ֎͸൒ࣗಈ • ͳΜͱ͔ɺαʔϏεؒͷࠩΛ͍͍ײ͡ʹຒΊͳ͕Βӡ༻͍ͯͨ͠ 10
  3. ϓϩδΣΫτൃ଍ • ݕূ؀ڥʹͯϓϩτλΠϓͷ։ൃ͕ൃ଍ • ͘͞ΒͷΫϥ΢υͱ͘͞Βͷઐ༻αʔό ߴՐྗͷϝϯόʔͰߏ੒ ʢاըɺ։ൃɺӡ༻ʣ • ࢲ΋։ൃͱӡ༻ͷ୲౰ͱͯ͠ࢀՃ •

    جຊతʹϦϞʔτͰΦϯϥΠϯίϛϡχέʔγϣϯ • ि࣍ͷఆྫϛʔςΟϯά • σʔληϯλʔͳͲͰͷݱ஍࡞ۀͷΈΦϑϥΠϯ 12
  4. ϓϩδΣΫτൃ଍ • ϓϥϯઃܭ(اըϝϯόʔ) • ԿΛ࡞ͬͯɺԿΛఏڙ͢Δ͔ɺԾ૝Ϛγϯͷઃܭ • ՝ۚઃܭɺϓϥϯ໊ • ӡ༻ઃܭ(ӡ༻ϝϯόʔ) •

    ϑΝΠϦςΟ໘(Ͳ͜Ͱಈ͔͔͢ɺNWɺిྗɺۭௐ) • ऩ༰ઃܭɺԾ૝ϚγϯͷઃܭɺηΩϡϦςΟධՁɾରࡦ • ࠷దͳঢ়ଶΛ࡞Δ • ͲͷΑ͏ͳํ๏Ͱӡ༻͢Δ͔ɺఆৗతͳϝϯςφϯε΍ɺো֐࣌ͷରԠ • νϡʔχϯά • ෛՙࢼݧ • ։ൃઃܭ(։ൃϝϯόʔ) • ͲͷΑ͏ʹ࡞Δ͔ • API΍ίϯτϩϧʔύωϧ͔ΒͷϦΫΤετʹै͍Ծ૝ϚγϯΛىಈͤ͞Δ෦෼·ͰΛ࡞Δ • Ծ૝ϚγϯͷεέδϡʔϦϯά 13 ઃܭޙɺ֤୲౰͝ͱʹɺ࣮૷΍४උͳͲʹਐΉ
  5. ӡ༻ઃܭ • طଘͷ෺ཧͷGPUαʔϏε(ߴՐྗ)Ͱ΋࣮੷ͷ͋ΔɺੴङDCʹܾఆ • ϓϥϯઃܭʹج͍ͮͯऩ༰ઃܭΛ࣮ࢪ • طଘͷԾ૝Խج൫(Linux KVM)ͰGPUׂ౰Λߦ͍Ծ૝ϚγϯΛىಈ͢Δํ๏Λௐࠪɾݕূ • GPU

    Pass-Through (෺ཧͷGPUΛͦͷ··Ծ૝Ϛγϯʹׂ౰) • GPUԾ૝Խ੡඼ • GPUʹΑΔHWଆͰͷԾ૝Խ • GPU׬શԾ૝Խ GVT-g (KVMGT) • GPU४Ծ૝Խ virtio-gpu • →ύϑΥʔϚϯεͷ؍఺ͱԾ૝Խͷඞཁ͕ͳ͍͜ͱ͔ΒɺGPU Pass-Throughʹܾఆ • GPUׂ౰͸ϗετ্ͷGPUͷPCIeͷBus:Device.Function (BDF)Λ༻͍ͯߦ͏ 16
  6. ӡ༻ઃܭ • ֤छΠϯϑϥΛ੡඼൛ͱಉ͡ߏ੒ʹ͢Δ • 1ϗετ্Ͱෳ਺Ծ૝Ϛγϯ͕ىಈͨ͠৔߹ͷݕূ • ύϑΥʔϚϯενϡʔχϯά • NUMA •

    Ծ૝Ϛγϯͷઃܭʹج͍ͮͨઃఆɺಈ࡞ݕূ • GPUͷಈ࡞ʹ࠷దͳ؀ڥΛ੔උ͢ΔͨΊͷݕূɾઃఆ • ෛՙࢼݧɺϕϯνϚʔΫ • ϗετͷCPU,ϝϞϦ • Ծ૝ϚγϯͷGPU • ؂ࢹ಺༰ͷݕ౼ 23
  7. • NUMA • ෳ਺CPUΛ౥ࡌ͢Δαʔόʹ͓͍ͯߏ੒͞ΕΔΞʔΩςΫνϟ • ϘτϧωοΫɺϝϞϦΞΫηεͷ࠷దԽͳͲʹͭͳ͕Δ • Nodeͱ͍͏άϧʔϓ͕͋Δ (lstopoίϚϯυͳͲͰ֬ೝ͢Δ͜ͱ͕Ͱ͖Δ) •

    Ծ૝ϚγϯʹׂΓ౰ͯΔɺCPUɺϝϞϦɺGPUͷ૊Έ߹Θ͕ͤnodeΛލ͍ͩ৔ ߹ɺύϑΥʔϚϯεʹӨڹΛٴ΅͢͜ͱ͕෼͔Γߟྀͨ͠ઃܭɾ࣮૷Λ࣮ࢪ • Ծ૝Ϛγϯىಈ࣌ʹNUMA node͕ἧ͏Α͏ʹࢦఆ͠ىಈͤ͞Δ ӡ༻ઃܭ 24 NUMA node1 NUMA node2
  8. ӡ༻ઃܭ • Ծ૝Ϛγϯͷઃܭʹج͍ͮͨઃఆɺಈ࡞ݕূ • ౰ॳ͸෺ཧαʔόᝑମʹ౥ࡌͨ͠ϝϞϦΛͳΔ΂͘Ծ૝Ϛγϯʹׂ౰͢Δํ਑ͩͬͨ • ىಈͨ͠΋ͷͷqemuͷϓϩηε͕swapͯ͠͠·͏ࣄଶ͕ൃੜ • ύϑΥʔϚϯεͷ؍఺ͰΑ͘ͳ͍ঢ়ଶ •

    ىಈͯؒ͠΋ແ͘qemuͷϓϩηε͕ऴྃͯ͠͠·͏ࣄଶ͕ • oom-killerʹΑͬͯqemuϓϩηε͕ڧ੍ऴ͍ྃͯͨ͜͠ͱ͕ൃ֮…😇 • ϗετͰಈ࡞͢Δ֤छαʔϏεΛ֬ೝ҆͠શʹಈ࡞͢ΔϝϞϦ༰ྔΛܭࢉ͠ɺͦͷεϖοΫͰఏ ڙ͢Δ͜ͱʹ • Ұ෦γεςϜܥͷσʔϞϯ͕ϝϞϦϦʔΫ͍ͯͨ͠ΓɺͦͷରࡦͳͲ΋࣮ࢪ • ҆ఆͨ͠ঢ়ଶͰԾ૝ϚγϯΛಈ͔ͨ͢ΊʹɺεϖοΫͷ૊Έ߹ΘͤݕূΛࢼߦࡨޡ • γεςϜશମʹϝϞϦͷۭ͖༰ྔ͕͋ͬͨͱͯ͠΋ɺNUMA node͋ͨΓͷϝϞϦͷۭ͖͕ͳ͍ͱ oom-killerͰVM͕ࢭΊΒΕͯ͠·͏ֶͼ͕ಘΒΕͨ 28
  9. ӡ༻ઃܭ • GPUͷಈ࡞ʹ࠷దͳ؀ڥΛ੔උ͢ΔͨΊͷݕূɾઃఆ • ΤΞϑϩʔ͕ਖ਼ৗͰɺద੾ͳԹ౓Ͱ͋Δ͜ͱ • ϑΝϯͷճస਺੍ޚɺϑΝϯͷҐஔΛม͑ΔͳͲͷରԠ • ϑΝϯ͸GPUʹ͸౥ࡌ͞Ε͓ͯΒͣɺυϥΠϠʔͷΑ͏ͳ෩ѹͷϑΝϯΛᝑମʹऔΓ෇͚Δ •

    GPU͕ྫྷ٫͞Εͳ͍ͱɺGPU಺෦ϓϩηοαͷಈ࡞प೾਺͕௿Լ͢Δ • ҰํͰϑΝϯΛશ։ʹͯ͠΋ແବ͕ੜ͡ΔͨΊɺίετͱੑೳʹ͓͍ͯόϥϯε͕औΕͨঢ়ଶΛ ୳͠ɺݟ͚ͭΔ • αʔόᝑମͷIPMIͱGPU͔Β֤छϝτϦΫεΛPrometheusͰऩूɺGrafanaͰμογϡϘʔυΛ࡞ ੒͠ՄࢹԽ • ͍͔ͭ͘ͷϑΝϯͷϞʔυΛࢼ͢΋͏·͍͔ͣ͘αʔόͷ୅ཧళʹ໰͍߹Θͤͨ • BMCͷόʔδϣϯ͕ݹ͘Ξοϓσʔτͨ͠ͱ͜Ζظ଴͢Δ݁Ռ͕ಘΒΕ࠷దͳঢ়ଶ͕Ͱ͖ͨ • ݕূதϑΝϯΛશ։ʹͨ͠ͱ͜ΖɺGPUαʔόͷᝑମͷഎ໘ଆʹ͋ΔଞͷαʔόͷԹ౓্͕ঢ͠ ͯ͠·͏ࣄ৅͕ൃੜͨ͠ɺͦΕΒ΋ߟྀͯ͠؀ڥΛ੔උ 29
  10. ӡ༻ઃܭ • GPUͷಈ࡞ʹ࠷దͳ؀ڥΛ੔උ͢ΔͨΊͷݕূɾઃఆ 30 ϗετ ෺ཧαʔόᝑମ ϋΠύʔόΠβʔ -JOVY,7. ϗετ04 GPU

    GPU GPU GPU Ծ૝Ϛγϯ Ծ૝Ϛγϯ ɾɹɾɹ ɾɾ GPUʹෛՙΛ͔͚Δɺgpu_exporterΛ࣮ߦ GPUʹෛՙΛ͔͚Δ ˍ gpu_exporterΛ࣮ߦ ipmi_exporter ipmi_exporter(αʔόᝑମͷϝτϦΫεΛऔಘɺফඅిྗɺԹ౓ɺϑΝϯճస਺౳) gpu_exporter(GPUͷ֤छϝτϦΫεɺಈ࡞प೾਺ɺফඅిྗɺԹ౓ɺϝϞϦͳͲΛऔಘ)
  11. ӡ༻ઃܭ • ෛՙࢼݧɺϕϯνϚʔΫ • ফඅిྗ͕େ͖͘ͳΔɺԹ౓͕ߴ͘ͳΔέʔεΛ࡞੒͠Ұఆظ࣮ؒࢪ • ຊ൪؀ڥͱಉ͡ঢ়ଶϥοΫɺαʔόᝑମ਺Λἧ͑ͯෛՙΛ͔͚Δ • جຊతʹ͸ઌ΄Ͳͱ΍Δ͜ͱ͸ಉ͡ɺҧ͍͸Ծ૝Ϛγϯͷ਺͕ଟ͘ͳΔ •

    TerraformͰෛՙࢼݧɺϕϯνϚʔΫ༻ͷԾ૝ϚγϯΛେྔʹల։ • ४උ͕੔ͬͨΒxargsίϚϯυͰҰ੪ʹԾ૝ϚγϯͱϗετʹෛՙΛ͔͚Δ • ͢΂ͯͷϗετɺԾ૝ϚγϯɺGPUͷঢ়ଶΛ֬ೝ͢ΔͨΊͷμογϡϘʔυΛ࡞੒͠ݟकΔ • Ծ૝Ϛγϯ • gpu_burn΍࣮ࡍͷϫʔΫϩʔυͳͲͰෛՙ • ϕϯνϚʔΫ͸ҰൠతͳGPUϕϯνϚʔΫͳͲΛ༻͍Δ • ϗετͷCPUɺϝϞϦ • ઐ༻ͷπʔϧΛ༻͍ͯෛՙ 32
  12. ӡ༻ઃܭ • ؂ࢹ಺༰ͷݕ౼ • طଘͷϗεταʔόʹର͢Δ؂ࢹʹՃ͑GPUͷ؂ࢹΛ͢Δඞཁ͕͋Δ • ϗετ͔ΒGPUʹΞΫηεͰ͖ͳ͍ͨΊ؂ࢹͰ͖ΔൣғͰߦ͏ • ϗεταʔόଆ •

    GPU౥ࡌεϩοτͷϦϯΫεϐʔυ • lspciͳͲͷ৘ใΛνΣοΫ • GPUࣗମͷ؂ࢹɺނোݕ஌ɾϔϧενΣοΫ͸ޙड़͢ΔʮαʔϏε VMʯͱ͍͏࢓૊ΈΛ༻͍ͯߦ͏͜ͱʹܾఆ 35
  13. ։ൃઃܭ • Ծ૝ϚγϯʹGPUΛׂ౰͠ىಈ͢Δ࢓૊ΈΛ࣮૷͠ɺຊ൪؀ڥʹ൓өͰ͖Δঢ়ଶʹ͢Δ • ੡඼൛Λߟྀͨ͠ઃܭɺ࣮૷ • αʔόΛىಈ͢ΔϓϩάϥϜ • NUMAΛߟྀͨ͠Ծ૝Ϛγϯʹର͢ΔCPU,MEM,GPUͷׂ౰ •

    ཁٻ͞ΕͨGPU਺ʹԠׂͯ͡౰ɺׂ౰ෆՄͷ৔߹ͷΤϥʔॲཧ • ౥ࡌ͞Ε͍ͯΔGPUͷঢ়ଶ؅ཧ(ະׂ౰ɺׂ౰தɺނো) • ঢ়ଶΛAPIʹ௨஌͢Δػೳ • GPUͷނোݕ஌ɺϔϧενΣοΫͷ࢓૊Έͷݕ౼ • API • GPUϗετͷࡏݿ؅ཧ • GPUϓϥϯͷ௥ՃɺGPUαʔόͷεέδϡʔϦϯά • GPUͷଐੑ৘ใͷ؅ཧͷݕ౼(GPUܕ൪ɺGPUϝϞϦɺݸମΛࣝผ͢Δ஋ɺetc…) 36
  14. ։ൃઃܭ • GPUͷނোݕ஌ɺϔϧενΣοΫͷ࢓૊Έͷݕ౼ • ϗετ͔Β͸GPUʹΞΫηεͰ͖ͳ͍ͨΊɺಛผͳԾ૝ϚγϯʮαʔϏεVMʯΛ༻͍ ͯߦ͏͜ͱʹܾఆ • ҎԼͷΑ͏ͳ࢓૊ΈΛ։ൃ࣮૷͠ɺࣗಈνΣοΫͷ࢓૊ΈΛཱ֬ • 1.Ծ૝ϚγϯఀࢭޙʹGPU͕ղ์͞ΕΔ

    • 2.ղ์͞ΕͨGPU͸࢖༻ࡁΈͱͯ͠ϚʔΫ͞ΕɺఆظతʹͦͷGPUΛΞλον͞Εͨ ʮαʔϏεVMʯ͕ىಈ • 3.GPUͷ਍அπʔϧ౳Λ༻͍ͯਖ਼ৗʹಈ࡞͢Δ͜ͱΛ֬ೝ • 4.ਖ਼ৗͳ৔߹ɺະׂ౰ͱͯ͠GPUͷঢ়ଶΛมߋ͢Δ • 5.ҟৗͳ৔߹ɺׂ౰͞Εͳ͍Α͏ʹނোͱͯ͠ϚʔΫ͞ΕΔɺϗεταʔόʹ௨஌Λߦ ͍؂ࢹπʔϧͳͲ͕ͦΕΛ΋ͱʹΞϥʔτΛൃใ͢Δ 37 ͜ͷ࢓૊Έͷ࣮૷ͷҰ؀Ͱɺ࣮ࡍʹࣾ಺ʹ͋ͬͨյΕͨGPUΛ༻͍ͯҟৗܥͷςετ΋࣮ࢪ
  15. ੡඼൛ 39 ϗετ ෺ཧαʔόᝑମ ϋΠύʔόΠβʔ -JOVY,7. ϗετ04 GPU GPU GPU

    GPU Ծ૝Ϛγϯ Ծ૝Ϛγϯ ɾɹɾɹɾ ɾɾɾ αʔόΛىಈͤ͞Δ ϓϩάϥϜ αʔϏεVM
  16. • ۤ࿑ͨ͠఺ • Ծ૝Ϛγϯͷઃܭʹ͓͍ͯ҆ఆ͢ΔεϖοΫΛܾΊΔ • ͋ΒΏΔ૊Έ߹ΘͤΛߟ͑ݕূ͢Δͷ͕େมͩͬͨ • ՝୊͕ൃੜͨ͠৔߹ͷ੾Γ෼͚ • ϨΠϠʔ͕བྷΈ߹͏ࣄ৅͸͋Δఔ౓צ͕ͳ͍ͱɺ੾Γ෼͚͕೉͍͠

    • ϋΠύʔόΠβʔ/ϗετOS(Kernel)/GPU/αʔόᝑମ/etc… • ੾Γ෼্͚ͨͰɺҟͳΔ໰͍߹ΘͤઌʹΤεΧϨʔγϣϯΛߦ͏ • ਂ۷Γͨ͠஌͕ࣝඞཁʹͳΔ • PCI-Expressʹର͢ΔཧղɺϋΠύʔόΠβʔɾԾ૝ϚγϯɺOSͷϝϞϦ؅ཧ 45
  17. • ײ૝ • ॳΊͯ৮ΕΔྖҬ͕৽઱ͩͬͨ • PCI-Expressͷ࢓༷(ॻ੶Λߪೖͯ͠ษڧ) • ࣗ෼ͰσόΠεΛ࡞ͬͯΈ͍ͨͱࢥ͍ɺFPGAͳͲʹڵຯΛ࣋ͬͨ • ͞·͟·ͳϨΠϠʔʹରٕͯ͠ज़Λ࣋ͬͯରԠ͢Δͷ͕ྑ͍ܦݧʹͳͬͨ

    • ݁ߏେม͕ͩͬͨɺ޷͖ͳ͜ͱΛ࢓ࣄͱͯ͠Ͱ͖ͯຬ଍ • TellusͰ΋ར༻͞ΕΔΑ͏ʹͳΓخ͍͠ • GPUΛ࢖͏ͨΊͷ؀ڥߏஙͷϋʔυϧ͕ߴ͍ͷͰͦ͜Λղܾ͢ΔΑ͏ͳ΋ ͷΛఏڙ͍ͨ͠ 46
  18. • ࠷ޙʹ • json΍yamlͰΠϯϑϥɾΫϥ΢υΛ࢖͏͜ͱ͕Ͱ͖Δ࣌୅ • Πϯϑϥ͕ந৅Խ͞Εɺ࢖͍΍͘͢ͳΔ • ΍Γ͍ͨ͜ͱʹूதͰ͖Δ͜ͱ͸ྑ͍͜ͱ • ҰํͰΫϥ΢υͷઌͷੈք͸͞·͟·ͳٕज़Ͱߏ੒͞Ε͍ͯΔ

    • ࠓճ͝঺հͨ͠಺༰͸΄ΜͷҰ෦ • ͘͞ΒΠϯλʔωοτͷٕज़ελοΫΛ·ͱΊͯΈͨ(Qiitaهࣄ) • https://qiita.com/jh1vxw/items/f460f33e00614c9d2510 47 Ϋϥ΢υΛ࡞Δଆʹ͝ڵຯ͕͋Γ·ͨ͠Βɺ͘͞ΒΠϯλʔωοτͰ͓·͓ͪͯ͠Γ·͢ʂ