{"id":3786,"date":"2021-04-29T15:20:12","date_gmt":"2021-04-29T13:20:12","guid":{"rendered":"https:\/\/vm.piszki.pl\/?p=3786"},"modified":"2021-04-29T15:20:16","modified_gmt":"2021-04-29T13:20:16","slug":"cloudstack-kvm-i-uruchomienie-vm-z-vgpu","status":"publish","type":"post","link":"https:\/\/vm.piszki.pl\/?p=3786","title":{"rendered":"CloudStack &ndash; KVM i uruchomienie VM z vGPU"},"content":{"rendered":"<p align=\"justify\">W wielu firmach i innych miejscach (np. na Uniwersytetach) zyska\u0142y ostatnio na popularno\u015bci karty GPU (np. Nvidia V100). Karta taka mo\u017ce by\u0107 wykorzystana na wiele sposob\u00f3w, do oblicze\u0144 z wykorzystaniem CUDA ale i do wirtualizacji (NVIDIA RTX Virtual Workstation). Dzi\u0119ki wsparciu dla vGPU, mo\u017cemy tak\u0105 kart\u0119 podzieli\u0107 zgodnie z po\u017c\u0105danym profilem (o czym p\u00f3\u017aniej) i uruchomi\u0107 do 32 wirtualnych maszyn (per fizyczna karta) gdzie ka\u017cda b\u0119dzie mia\u0142a mo\u017cliwo\u015b\u0107 dzia\u0142ania z w\u0142asnym procesorem GPU. W tym artykule chcia\u0142bym dok\u0142adnie om\u00f3wi\u0107 dwa aspekty, pierwszym jest fizyczne przekazanie karty (jednej lub wielu) do VM (GPU passthrough) a drugim wykorzystanie vGPU. W obu przypadkach odbiorc\u0105 ko\u0144cowym b\u0119dzie VM uruchomiona w CloudStack, aczkolwiek pewne techniki tu opisane mo\u017cna u\u017cy\u0107 w dowolnym IaaS (np. Proxmox, Openstack, vSphere i inne).<\/p>\n<p align=\"justify\"><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/8x-NVIDIA-Tesla-V100-32GB-Server.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"8x-NVIDIA-Tesla-V100-32GB-Server\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/8x-NVIDIA-Tesla-V100-32GB-Server_thumb.jpg\" alt=\"8x-NVIDIA-Tesla-V100-32GB-Server\" width=\"645\" height=\"395\" border=\"0\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<p align=\"justify\">Pierwszym krokiem jest przygotowanie serwera, kroki opisane ni\u017ce s\u0105 takie same dla PCI passthrough jak i dla vGPU. Zaczynamy od w\u0142\u0105czenia IOMMU, jest to kluczowa faza, bez wsparcia dla IOMMU nie b\u0119dziemy mogli wyizolowa\u0107 karty PCI w celu jej przekierowania do VM. Generalnie w BIOS lub UEFI r\u00f3\u017cnych producent\u00f3w jest to r\u00f3\u017cnie opisane, mamy przewa\u017cnie dwie funkcje, pierwsz\u0105 jest w\u0142\u0105czenie wirtualizacji a drug\u0105 w\u0142\u0105czenie IOMMU. W Supermicro dla przyk\u0142adu te dwie opcj\u0105 nazywaj\u0105 si\u0119 Intel Virtualization Technology i Intel VT for Directed I\/O (VT i VT-d):<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/9b869fc6-10f6-45f5-a8d3-9c4b2b2d9e7e.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"9b869fc6-10f6-45f5-a8d3-9c4b2b2d9e7e\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/9b869fc6-10f6-45f5-a8d3-9c4b2b2d9e7e_thumb.jpg\" alt=\"9b869fc6-10f6-45f5-a8d3-9c4b2b2d9e7e\" width=\"649\" height=\"257\" border=\"0\" \/><\/a><\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/04464238-b237-4741-9110-b270ece865dd.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"04464238-b237-4741-9110-b270ece865dd\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/04464238-b237-4741-9110-b270ece865dd_thumb.jpg\" alt=\"04464238-b237-4741-9110-b270ece865dd\" width=\"648\" height=\"370\" border=\"0\" \/><\/a>\u00a0Po restarcie wydajemy polecenie cat \/var\/log\/messages* | grep \u2013E \u201cDMAR|IOMMU\u201d lub dmesg | grep \u2013E \u201cDMAR|IOMMU\u201d, spodziewany efekt to komunikat IOMMU Enabled:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp4.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp4\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp4_thumb.jpg\" alt=\"gp4\" width=\"651\" height=\"505\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W kolejnym kroku musimy wy\u0142\u0105czy\u0107 natywny sterownik Nvidia Nouveau kt\u00f3ry jest cz\u0119\u015bci\u0105 kernela. Robimy to w dw\u00f3ch miejscach, jednym jest utworzenie pliku \/etc\/modprobe.d\/nvidia.conf z zawarto\u015bci\u0105:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp1.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp1\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp1_thumb.jpg\" alt=\"gp1\" width=\"651\" height=\"103\" border=\"0\" \/><\/a><\/p>\n<p>Podobn\u0105 zawarto\u015b\u0107 dodajemy do \/etc\/default\/grub :<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp2-5.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp2\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp2_thumb.jpg\" alt=\"gp2\" width=\"969\" height=\"162\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nast\u0119pnie musimy wygenerowa\u0107 nowe obrazy initrd, warto to zrobi\u0107 po wcze\u015bniejszym zaktualizowaniu systemu i restarcie, wydajemy nast\u0119puj\u0105ce polecenia:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp3.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp3\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp3_thumb.jpg\" alt=\"gp3\" width=\"979\" height=\"253\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nast\u0119pnie wykonujemy restart systemu. W tym momencie mamy przygotowany serwer do dalszych krok\u00f3w, mo\u017cemy sobie dla pewno\u015bci zweryfikowa\u0107 obecno\u015b\u0107 karty lub kart NVIDIA w systemie:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp5.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp5\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp5_thumb.jpg\" alt=\"gp5\" width=\"993\" height=\"112\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W tym konkretnym przypadku mamy cztery karty Nvidia Tesla V100 spi\u0119te SLI, wi\u0119c jest to bardzo powa\u017cna koparka bitcoin, tfu oczywi\u015bcie serwer do powa\u017cnych oblicze\u0144 naukowych <img decoding=\"async\" class=\"wlEmoticon wlEmoticon-winkingsmile\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/wlEmoticon-winkingsmile.png\" alt=\"Winking smile\" \/><\/p>\n<p align=\"justify\">Zacznijmy od PCI passthrought (GPU jest niczym innym jak kart\u0105 PCI) za pomoc\u0105 VFIO. Ca\u0142o\u015b\u0107 konfiguracji b\u0119dzie dotyczy\u0142a CentOS 7 ale generalnie w ca\u0142o\u015bci jest bardzo podobna na pozosta\u0142ych systemach Linux. Tutaj dodatkowo musimy przekaza\u0107 karty pod zarz\u0105dzanie sterownikiem VFIO, na rysunku powy\u017cej wida\u0107 parametry Vendor-ID i Device-ID (druga kolumna od prawej), te dane musimy wpisa\u0107 do pliku \/etc\/modprobe.d\/vfio.conf :<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp6.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp6\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp6_thumb.jpg\" alt=\"gp6\" width=\"997\" height=\"71\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W przypadku pojedynczej karty wpisujemy to raz, w przypadku wi\u0119kszej ilo\u015bci kart tyle razy ile ich mamy (nawet je\u015bli te ID s\u0105 takie same). Restartujemy serwer i szukamy wpis\u00f3w o vfio w \/var\/log\/messages po restarcie. Mo\u017cemy teraz przej\u015b\u0107 do CloudStack i generalnie do KVM. Wirtualna maszyna jest w ca\u0142o\u015bci opisana plikiem XML, przekazanie jej urz\u0105dzenia typu GPU jest niczym innym jak uzupe\u0142nieniem jej konfiguracji o definicj\u0119 takiego urz\u0105dzenia. Dla moich czterech kart Tesla wygl\u0105da to tak:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp7-5.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp7\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp7_thumb.jpg\" alt=\"gp7\" width=\"976\" height=\"903\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Nie jest to skomplikowane, bus=0x61 odpowiada adresowi z lspci (rysunek powy\u017cej, pierwsza kolumna, pierwszy wiersz), alias i address to definicja PCI wewn\u0105trz VM. Dla czterech kart definicj\u0119 musia\u0142em rozbi\u0107 na dwie cz\u0119\u015bci ze wzgl\u0119du na ograniczenie pola do wprowadzania danych w CloudStack. Przekazanie tej konfiguracji w VM w CloudStack wymaga u\u017cycia opcji extraconfig dla istniej\u0105cej VM. Mo\u017cemy to zrobi\u0107 standardowo u\u017cywaj\u0105c CloudMonkey (CMK):<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp8.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp8\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp8_thumb.jpg\" alt=\"gp8\" width=\"955\" height=\"275\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Ten dziki ci\u0105g znak\u00f3w to wy\u017cej wymieniona definicja urz\u0105dze\u0144 przekonwertowana do <a href=\"https:\/\/www.urlencoder.org\/\">url encode<\/a> (API dzia\u0142a przez http, informacja musi by\u0107 zgodna ze standardem). W wersji CloudstaCk 4.15 i wy\u017cej, za pomoc\u0105 nowego UI Primate mo\u017cemy to samo doda\u0107 do VM w prostszy spos\u00f3b, dodaj\u0105c opcj\u0119 extraconfig-1 w ustawieniach VM. W przypadku pojedynczej karty GPU wystarczy extraconfig-1, ja musia\u0142em cztery karty rozbi\u0107 na dwa wpisy:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp11.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp11\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp11_thumb.jpg\" alt=\"gp11\" width=\"962\" height=\"305\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Dalej instalujemy w VM <a href=\"https:\/\/developer.nvidia.com\/cuda-downloads?target_os=Linux&amp;target_arch=x86_64&amp;=Ubuntu&amp;target_version=20.04&amp;target_type=deb_network\">sterowniki<\/a> zgodnie z <a href=\"https:\/\/docs.nvidia.com\/cuda\/cuda-installation-guide-linux\/index.html#post-installation-actions\">dokumentacj\u0105<\/a> Nvidia, instalator sam dodaje odpowiednie wpisy blokuj\u0105ce sterownik Nouveau. Spodziewany efekt to poprawnie dzia\u0142aj\u0105ce polecenie nvidia-smi w VM:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp10.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp10\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp10_thumb.jpg\" alt=\"gp10\" width=\"962\" height=\"858\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">I to w zasadzie tyle, mo\u017cemy kopa\u0107, tfu, prowadzi\u0107 ci\u0119\u017ckie obliczenia <img decoding=\"async\" class=\"wlEmoticon wlEmoticon-winkingsmile\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/wlEmoticon-winkingsmile.png\" alt=\"Winking smile\" \/><\/p>\n<p align=\"justify\">Wy\u017cej opisana konfiguracja dotyczy najprostszej formy przekazania GPU do VM, teraz zajmiemy si\u0119 t\u0105 ciekawsz\u0105, Nvidia umo\u017cliwia podzielenie takiej karty na vGPU. Oczywi\u015bcie mam na my\u015bli karty kt\u00f3re to umo\u017cliwiaj\u0105, takie jak Tesla V100. Ta funkcja jest niestety licencjonowana, licencje s\u0105 bardzo tanie (<a href=\"https:\/\/www.nvidia.com\/en-us\/design-visualization\/virtual-workstation\/\">Nvidia RTX Virtual Workstation<\/a> kosztuje $400), mo\u017cna te\u017c wygenerowa\u0107 sobie czasow\u0105 licencj\u0119 na 90 dni. Dodatkowo musimy te\u017c zainstalowa\u0107 serwer licencji, oprogramowanie jak i licencje pobieramy z <a href=\"https:\/\/enterpriseproductregistration.nvidia.com\/?LicType=EVAL&amp;ProductFamily=vGPU\">Portalu Licencji Nvidia<\/a>. Na serwerze (z w\u0142aczonym iommu i zablokowanym sterownikiem nouveau) instalujemy sterowniki Nvidia, spodziewany efekt po restarcie to dzia\u0142aj\u0105ce polecenie nvidia-smi jak na rysunku powy\u017cej. Dodatkowo czy prawid\u0142owo jest uruchomiony sterownik Nvidia VFIO:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp12.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp12\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp12_thumb.jpg\" alt=\"gp12\" width=\"972\" height=\"636\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Teraz musimy zdecydowa\u0107 jakiego profilu GPU chcemy u\u017cy\u0107, jest to o tyle istotne, \u017ce na raz mo\u017ce by\u0107 u\u017cyty tylko jeden. Na rysunku powy\u017cej nvidia-* oznacza w\u0142a\u015bnie dost\u0119pne profile, do ka\u017cdego katalogu mo\u017cna wej\u015b\u0107 i przeczyta\u0107 plik description gdzie dok\u0142adnie s\u0105 opisane w\u0142a\u015bciwo\u015bci danego profilu. My u\u017cyjemy nvidia-358 (profil o oznaczeniu 8Q ):<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp13.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp13\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp13_thumb.jpg\" alt=\"gp13\" width=\"982\" height=\"102\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Profil ten jest o tyle istotny, \u017ce wspiera CUDA. Proces generowania vGPU jest prosty:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp14.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp14\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp14_thumb.jpg\" alt=\"gp14\" width=\"996\" height=\"112\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Przygotowanie XML z urz\u0105dzeniem te\u017c jest bardzo podobne (i co wa\u017cne, mo\u017cemy u\u017cy\u0107 wielu vGPU w jednej VM na tej samej zasadzie, jak ja czterech kart fizycznych):<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp15.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp15\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp15_thumb.png\" alt=\"gp15\" width=\"998\" height=\"262\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">W CloudStack post\u0119pujemy dok\u0142adnie tak jak zosta\u0142o to opisane wy\u017cej, w VM instalujemy sterowniki oraz CUDA, spodziewany efekt to oczywi\u015bcie wszystko dzia\u0142aj\u0105ce poprawnie:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp16.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp16\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp16_thumb.jpg\" alt=\"gp16\" width=\"566\" height=\"632\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">Na koniec jeszcze s\u0142owo na temat konsoli. VM generalnie startuje z emulowan\u0105 kart\u0105 grafiki QLX i ta karta startuje jako pierwsza. Aby wy\u0142\u0105czy\u0107 QLX, musimy odpowiednio spreparowa\u0107 plik urz\u0105dzenia GPU, musimy tylko pami\u0119ta\u0107, aby zainstalowa\u0107 wcze\u015bniej sterowniki Nvidia, bez tego na konsoli b\u0119dziemy mieli komunikat o braku zainicjalizowanych sterownik\u00f3w dla karty graficznej. Plik XML wygl\u0105da tak:<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp17.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;\" title=\"gp17\" src=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp17_thumb.jpg\" alt=\"gp17\" width=\"850\" height=\"283\" border=\"0\" \/><\/a><\/p>\n<p align=\"justify\">I to w zasadzie tyle, je\u015bli macie pytania w tym temacie to prosz\u0119 o komentarze.<\/p>\n<p align=\"justify\">Tym artyku\u0142em chcia\u0142bym zaanonsowa\u0107 sw\u00f3j powr\u00f3t do pisania na blogu, przerwa by\u0142a d\u0142uga ale ostatnimi czasy jestem bardzo zaj\u0119ty przy kolejnych projektach.<\/p>\n<p><a href=\"https:\/\/vm.piszki.pl\/wp-content\/uploads\/2021\/04\/gp7-5.png\">\u00a0<\/a><\/p>\n<div style='text-align:left' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>W wielu firmach i innych miejscach (np. na Uniwersytetach) zyska\u0142y ostatnio na popularno\u015bci karty GPU (np. Nvidia V100). Karta taka mo\u017ce by\u0107 wykorzystana na wiele sposob\u00f3w, do oblicze\u0144 z wykorzystaniem CUDA ale i do wirtualizacji (NVIDIA RTX Virtual Workstation). Dzi\u0119ki &hellip; <a href=\"https:\/\/vm.piszki.pl\/?p=3786\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","footnotes":""},"categories":[6],"tags":[116,147,108,152,148,150,151,149],"class_list":["post-3786","post","type-post","status-publish","format-standard","hentry","category-lab","tag-cloudstack","tag-gpu","tag-kvm","tag-libvirtd","tag-nvidia","tag-pci-passthrough","tag-qemu","tag-vfio"],"yasr_visitor_votes":{"stars_attributes":{"read_only":false,"span_bottom":false},"number_of_votes":0,"sum_votes":0},"_links":{"self":[{"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/posts\/3786"}],"collection":[{"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3786"}],"version-history":[{"count":4,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/posts\/3786\/revisions"}],"predecessor-version":[{"id":3799,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=\/wp\/v2\/posts\/3786\/revisions\/3799"}],"wp:attachment":[{"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vm.piszki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}