{"id":353169,"date":"2024-05-20T22:22:43","date_gmt":"2024-05-20T22:22:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=353169"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T22:22:43","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=353169","title":{"rendered":"<span>\u0414\u0435\u043b\u0438\u043c \u043d\u0435\u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u0432 Kubernetes: \u0448\u0435\u0440\u0438\u043d\u0433 GPU \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MIG \u0438 TimeSlicing<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/gk\/9m\/w1\/gk9mw1w-iekzg5-7e7jlhjxnq8s.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/gk\/9m\/w1\/gk9mw1w-iekzg5-7e7jlhjxnq8s.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0441\u043d\u043e\u0432\u0430 \u0410\u043d\u0442\u043e\u043d, DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 <a href=\"https:\/\/slc.tl\/w4syj\">Data- \u0438 ML-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 Selectel<\/a>. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0448\u0435\u0440\u0438\u043d\u0433\u0435 GPU \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MIG. \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b \u0442\u0435\u043c\u0443 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041e\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0448\u0435\u0440\u0438\u043d\u0433\u0430 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!<br \/>  <a name=\"habracut\"><\/a><br \/>  <b>\u041e \u0447\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c:<\/b><\/p>\n<p>  \u2192 <a href=\"#1\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0448\u0435\u0440\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 Kubernetes<\/a><br \/>  \u2192 <a href=\"#2\">GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/a><br \/>  \u2192 <a href=\"#3\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/a><br \/>  \u2192 <a href=\"#4\">\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c MIG \u0432 Kubernetes<\/a><br \/>  \u2192 <a href=\"#5\">\u0410\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/a><br \/>  \u2192 <a href=\"#6\">\u041a\u0430\u043a \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c GPU-\u0440\u0435\u0441\u0443\u0440\u0441\u044b Kubernetes \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TimeSlicing<\/a><br \/>  \u2192 <a href=\"#7\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<blockquote><p><b>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440:<\/b> \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u0432\u044b\u043a\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Helm-\u0447\u0430\u0440\u0442\u0430\u043c\u0438 \u0438 kubectl, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u043d\u0430\u043d\u0438\u0435 Kubernetes. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438\u0437\u0443\u0447\u0430\u0439\u0442\u0435 <a href=\"https:\/\/selectel.ru\/blog\/courses\/\">\u043a\u0443\u0440\u0441\u044b \u0432 \u0410\u043a\u0430\u0434\u0435\u043c\u0438\u0438 Selectel<\/a>.<\/p><\/blockquote>\n<p>  <a name=\"1\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0448\u0435\u0440\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 Kubernetes<\/h2>\n<p><\/font><br \/>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432 Kubernetes \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434 \u0441 \u043f\u0440\u0438\u0430\u0442\u0430\u0447\u0435\u043d\u043d\u043e\u0439 GPU.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c GPU \u043e\u0442 Nvidia \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u2014 <code>nvidia.com\/gpu = N<\/code>, \u0433\u0434\u0435 <code>N<\/code> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b: \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0443 \u043d\u0443\u0436\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0434\u0438\u043d \u043f\u043e\u0434 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b GPU.<\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0446\u0435\u043b\u0430\u044f GPU. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 A100, \u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c 40 \u0413\u0411 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u0431\u044b\u0432\u0430\u0435\u0442 \u0438\u0437\u043b\u0438\u0448\u043d\u0435. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 GPU \u2014 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0430\u0441\u0442\u0438\u0441\u044c \u043f\u0430\u0440\u0442\u0438\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u0435\u0439\u0441 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Data Science-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c GPU \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443 \u0432\u0430\u0441 \u0434\u0435\u0444\u0438\u0446\u0438\u0442 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u2014 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 Kubernetes, \u0442\u043e \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 JupyterLab \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0441\u0443\u0440\u0441 GPU (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435).<\/p>\n<p>  \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 GPU \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f DaemonSet <a href=\"https:\/\/github.com\/NVIDIA\/k8s-device-plugin\">Nvidia Device Plugin<\/a>. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043a\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 <a href=\"https:\/\/github.com\/NVIDIA\/k8s-device-plugin\/blob\/main\/cmd\/nvidia-device-plugin\/main.go\">\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043a\u043e\u0434\u0430<\/a>. \u041d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0442 Nvidia.<\/p>\n<p>  <a href=\"https:\/\/selectel.ru\/services\/dedicated\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=dedicated_article_gpusharing_300823_banner_030_ord\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dh\/s5\/wu\/dhs5wuzbgkz-7v2qc0d3jnkhdis.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dh\/s5\/wu\/dhs5wuzbgkz-7v2qc0d3jnkhdis.png\"\/><\/div>\n<p><\/a><br \/>  <a name=\"2\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/h2>\n<p><\/font>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/eda\/258\/620\/eda258620b60f3831dc8d4ac581002b6.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/eda\/258\/620\/eda258620b60f3831dc8d4ac581002b6.png\"\/><\/div>\n<p>  \u0420\u0430\u0437\u0431\u0438\u0442\u044c GPU \u0432 Kubernetes \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/docs.nvidia.com\/datacenter\/cloud-native\/kubernetes\/latest\/index.html\">\u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/a>, \u043d\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c. \u042d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c Kubernetes \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u0430\u043c\u0438 GPU \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0443\u0437\u043b\u0430\u043c\u0438 CPU \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 MIG \u0432 \u043d\u043e\u0434\u0430\u0445 \u0441 A100 \u0438 A30, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c TimeSlicing, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPU \u0432 Kubernetes, \u2014 mig-manager \u0438 nvidia-device-plugin.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/cf2\/0f4\/ceb\/cf20f4ceb752b69742584b24cc690ee4.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cf2\/0f4\/ceb\/cf20f4ceb752b69742584b24cc690ee4.png\"\/><\/div>\n<p>  Mig-manager \u2014 \u044d\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0435\u0442 \u0432 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043b\u0435\u0439\u0431\u043b\u0430 \u00abnvidia.com\/mig.config\u00bb \u043d\u0430 \u043d\u043e\u0434\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG. <\/p>\n<p>  \u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043a\u0438 mig-manager \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, gfd \u0438 dcgm-\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440. \u0417\u0430\u0442\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b GPU \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\/blob\/master\/assets\/state-mig-manager\/0410_configmap.yaml\">client.yml<\/a> (\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c), \u0435\u0441\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, mig-manager \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u0438 GPU. \u0420\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0443\u0437\u043b\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 MIG.<\/p>\n<h3>\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 GPU \u0432 K8S<\/h3>\n<p>  1. \u0414\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MIG GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0430 \u0434\u0435\u043c\u043e\u043d\u0441\u0435\u0442\u0430:<\/p>\n<ul>\n<li>mig-manager \u2014 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u043b\u0435\u0439\u0431\u043b\u043e\u043c nvidia.com\/mig.config. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e nvidia-smi \u043d\u0430 \u043d\u043e\u0434\u0435 \u0441 GPU. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443) \u0431\u0435\u0440\u0435\u0442 \u0438\u0437 <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\/blob\/cb25aa5643b78f8c84f93a4c05be4b11e859fd6e\/assets\/state-mig-manager\/0400_configmap.yaml\">configmap<\/a>. <\/li>\n<li>nvidia-device-plugin \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b nvidia\/gpu \u0432 Managed Kubernetes. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e mig-manager \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442 \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG, \u0430 \u043b\u0435\u0439\u0431\u043b nvidia\/mig.config.state \u0441\u0442\u0430\u043d\u0435\u0442 success, nvidia-device-plugin \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. <\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f single, \u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 nvidia.com\/gpu. \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f mixed \u2014 \u0437\u0430\u043c\u0435\u043d\u0438\u0442 nvidia.com\/gpu \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e.<\/p>\n<p>  2. \u0414\u0435\u043c\u043e\u043d\u0441\u0435\u0442\u044b \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u043d\u0430 \u043d\u043e\u0434\u0430\u0445. \u041f\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 MIG \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0435\u0439\u0431\u043b nvidia.com\/mig.config.state \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<ul>\n<li>pending \u2014 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c.<\/li>\n<li>succeed \u2014 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e.<\/li>\n<li>failed \u2014 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043e\u0448\u0438\u0431\u043a\u0438. <\/li>\n<\/ul>\n<p>  \u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432 GPU. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u0435 \u0437\u0430\u043d\u044f\u0442\u043e\u0439 GPU: \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u00ab\u0447\u0443\u0436\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b\u00bb. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/docs.nvidia.com\/datacenter\/cloud-native\/gpu-operator\/latest\/gpu-operator-mig.html\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <a name=\"3\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p><\/font><br \/>  \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u043b\u0438\u043d\u0435\u0439\u043a\u0443 GPU \u2014 A100 \u0438\u043b\u0438 A30. Selectel \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0447\u0430\u0441\u043e\u0432\u0443\u044e \u0430\u0440\u0435\u043d\u0434\u0443 \u0442\u0430\u043a\u0438\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442, \u0447\u0435\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f. \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c <a href=\"https:\/\/slc.tl\/gzliz\">Managed Kubernetes<\/a>:<\/p>\n<p>  1. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <b>\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/b> \u0432 <a href=\"https:\/\/my.selectel.ru\/\">\u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<p>  2. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c <b>Kubernetes<\/b> \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/b>.<\/p>\n<p>  3. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u043b ru-9a, \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u0443 \u043d\u043e\u0434:<\/p>\n<ul>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c flavor \u0441 GPU A100. <\/li>\n<li>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430.<\/li>\n<li>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  4. \u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 SSH-\u043a\u043b\u044e\u0447 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0441\u0435\u0442\u044c.<\/p>\n<p>  5. \u0416\u0434\u0435\u043c. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c\u0441\u044f, \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u044c kubeconfig.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/64ef4d46962d8d30c10ceda6\" data-style=\"\" id=\"64ef4d46962d8d30c10ceda6\" width=\"\"><\/div>\n<\/div>\n<p>  <i>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Managed Kubernetes.<\/i><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438. Kubernetes \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0432 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b NFS. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 <a href=\"https:\/\/slc.tl\/0iuvl\">\u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Selectel<\/a> (Selectel File Storage, SFS). \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <b>\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/b> \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/my.selectel.ru\/\">\u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a>.<\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c <b>\u0424\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/b> \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <b>C\u043e\u0437\u0434\u0430\u0442\u044c<\/b>.<\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u043b ru-9a, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430, \u0442\u0438\u043f NFS.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u0418\u0437 \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.<\/li>\n<\/ol>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/64ef4d47ff7a727696d0618c\" data-style=\"\" id=\"64ef4d47ff7a727696d0618c\" width=\"\"><\/div>\n<\/div>\n<p>  <i>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.<\/i><\/p>\n<h3>\u0424\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/h3>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Nvidia \u0432 \u043d\u0430\u0448\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c SFS, \u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u043e\u0434\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PV \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u043d\u043e\u0434\u0435)? \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u044b \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0430\u0448\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u043d\u043e\u0434\u0435 Kubernetes \u043f\u043e SSH, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 NFS \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438:<\/p>\n<pre><code class=\"bash\">sudo mkdir -p \/mnt\/nfs &amp;&amp; sudo mount -vt nfs \"10.222.1.60:\/shares\/share-3010a65e-124c-4ac8-b08e-a7b2eae0b78c\" \/mnt\/nfs <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0438 \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 \u043f\u043e\u0434\u0442\u044f\u043d\u0435\u043c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438. \u0422\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0430\u0435\u043c ONNX densenet (\u0441 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/748544\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 fetch_models:<\/p>\n<pre><code class=\"plaintext\">git clone -b r23.05 https:\/\/github.com\/triton-inference-server\/server.git cd server\/docs\/examples .\/fetch_models.sh <\/code><\/pre>\n<p>  \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 FX \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0435\u0441\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u043d\u0430\u0448 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440<i>:<\/i><\/p>\n<pre><code class=\"bash\">ls \/mnt\/nfs\/server\/docs\/examples\/ -l ls \/mnt\/nfs\/server\/docs\/examples\/model_repository\/ -l <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/b4c\/5c8\/066\/b4c5c8066ad597e2a33437ed895a32c1.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b4c\/5c8\/066\/b4c5c8066ad597e2a33437ed895a32c1.png\"\/><\/div>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0447\u0430\u0440\u0442 GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/h3>\n<p>  GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 nvidia-device-plugin. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 Managed Kubernetes \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 \u0441 GPU, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d:<\/p>\n<pre><code class=\"bash\">kubectl delete daemonset\/nvidia-device-plugin-daemonset -n kube-system <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Helm:<\/p>\n<pre><code class=\"bash\">helm install --wait --generate-name \\     -n kube-system --create-namespace \\     nvidia\/gpu-operator \\     --set mig.strategy=single <\/code><\/pre>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Mig:<\/p>\n<ul>\n<li><code>mig.strategy=single<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b GPU \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f MIG. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u044f\u0442 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f GPU A100 \u0438 A30 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\/blob\/master\/assets\/state-mig-manager\/0400_configmap.yaml\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 single \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 all).<\/li>\n<li><code>mig.strategy=mixed<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 GPU \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 MIG. \u041f\u0440\u0438\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043b\u044e\u0431\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439. \u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\/blob\/master\/assets\/state-mig-manager\/0400_configmap.yaml\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 MIG \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 A100 \u0438 A30 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/748544\/%233\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 GPU \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u0435\u0439\u0431\u043b\u044b \u043d\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a Nvidia:<\/p>\n<pre><code class=\"bash\">kubectl get node &lt;node name> -o json | jq '.metadata.labels' | grep nvidia<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/171\/24a\/c7c\/17124ac7ce0e435adafc3745c0186ff7.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/171\/24a\/c7c\/17124ac7ce0e435adafc3745c0186ff7.png\"\/><\/div>\n<p>  \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043b\u0435\u0439\u0431\u043b\u044b:<\/p>\n<ul>\n<li><code>nvidia.com\/gpu.count <\/code>\u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 GPU (\u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1 \u2014 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430),<\/li>\n<li><code>nvidia.com\/gpu.product <\/code>\u2014 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0447\u0442\u043e \u043d\u043e\u0434\u0430 \u0441 GPU A100,<\/li>\n<li><code>nvidia.com\/mig.config<\/code> \u2014 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f MIG \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (all-disabled \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e MIG \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d),<\/li>\n<li><code>nvidia.com\/mig.config.state <\/code>\u2014 \u0441\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f MIG (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f mig-manager),<\/li>\n<li><code>nvidia.com\/mig.strategy<\/code> \u2014 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439, single. <\/li>\n<\/ul>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c MIG \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u00ab\u043e\u0434\u0438\u043d \u043f\u043e\u0434 \u2014 \u043e\u0434\u043d\u0430 GPU\u00bb. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e triton server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0436\u0435\u043c \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c SFS-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u0432\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1 kind: Deployment metadata: name: tritonserver labels:   app: tritonserver spec: replicas: 2 selector:   matchLabels:     app: tritonserver template:   metadata:     labels:       app: tritonserver   spec:     volumes:     - name: models       nfs:         server: 10.222.1.60 # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 nfs \u0441\u0435\u0440\u0432\u0435\u0440\u0430         path: \/shares\/share-3010a65e-124c-4ac8-b08e-a7b2eae0b78c\/server\/docs\/examples\/model_repository # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f         readOnly: false     containers:       - name: tritonserver         ports:         - containerPort: 8000           name: http-triton         - containerPort: 8001           name: grpc-triton         - containerPort: 8002           name: metrics-triton         image: \"nvcr.io\/nvidia\/tritonserver:23.05-py3\"         volumeMounts:         - mountPath: \/models           name: models         command: [\"\/bin\/sh\", \"-c\"]         args: [\"\/opt\/tritonserver\/bin\/tritonserver --model-repository=\/models --allow-gpu-metrics=false\"]         resources:           limits:             nvidia.com\/gpu: 1 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432\u0441\u0442\u0430\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/c35\/785\/2cc\/c357852cc79281f953eac769b677a058.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c35\/785\/2cc\/c357852cc79281f953eac769b677a058.png\"\/><\/div>\n<p>  \u041d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043d\u043e\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0441\u0443\u0440\u0441 GPU. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"bash\">0\/1 nodes are available: 1 Insufficient nvidia.com\/gpu. preemption: 0\/1 nodes are available: 1 No preemption victims found for incoming pod. <\/code><\/pre>\n<p>  <a name=\"4\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c MIG \u0432 Kubernetes<\/h2>\n<p><\/font><br \/>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c MIG \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0437\u0430 \u043d\u0430\u0441. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0431\u0435\u0440\u0435\u043c \u043c\u0443\u0441\u043e\u0440: \u0443\u0434\u0430\u043b\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 triton server \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 MIG.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u043d\u043e\u0434\u0435 \u043f\u043e SSH \u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043c nvidia-smi. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 MIG \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/9fc\/c77\/985\/9fcc77985243c5fff0ad3278db94dbc7.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9fc\/c77\/985\/9fcc77985243c5fff0ad3278db94dbc7.png\"\/><\/div>\n<p>  \u041a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c MIG \u0438 \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e? \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043b\u0435\u0439\u0431\u043b nvidia.com\/mig.config \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043f\u043e <a href=\"https:\/\/github.com\/NVIDIA\/gpu-operator\/blob\/master\/assets\/state-mig-manager\/0400_configmap.yaml\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u0441\u0435\u043c\u044c \u0440\u0430\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<pre><code class=\"bash\">kubectl label node &lt;node name> nvidia.com\/mig.config=all-1g.5gb --overwrite <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/7db\/999\/5f2\/7db9995f2f2aefb7107c04d3a24922bb.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7db\/999\/5f2\/7db9995f2f2aefb7107c04d3a24922bb.png\"\/><\/div>\n<p>  \u0417\u0430\u0439\u0434\u0435\u043c \u0432 \u043b\u043e\u0433\u0438 mig-manager. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043e\u043d \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043b\u0435\u0439\u0431\u043b\u0430 \u0438 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e \u0441\u0443\u0442\u0438, \u0437\u0430\u0448\u0435\u043b \u043d\u0430 \u043d\u043e\u0434\u0443 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b 19 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/969\/e70\/e12\/969e70e123a97101525ed8ba43292117.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/969\/e70\/e12\/969e70e123a97101525ed8ba43292117.png\"\/><\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u043d\u043e\u0434\u0435 \u043f\u043e SSH \u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043c nvidia-smi:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/a5c\/74c\/f48\/a5c74cf4863c2aa4996eabac17fdbf08.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a5c\/74c\/f48\/a5c74cf4863c2aa4996eabac17fdbf08.png\"\/><\/div>\n<p>  \u041d\u0430\u0448\u0430 GPU \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0441\u0435\u043c\u044c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439. \u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0432 Kubernetes? \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 GPU:<\/p>\n<pre><code class=\"bash\">kubectl get node &lt;node name> -o json | jq '.status.allocatable <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/45c\/33a\/7a7\/45c33a7a731a9961cf070ed86637896b.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/45c\/33a\/7a7\/45c33a7a731a9961cf070ed86637896b.png\"\/><\/div>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e Single, \u0432 Kubernetes \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0441\u0435\u043c\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 GPU. \u0414\u0430\u043b\u0435\u0435 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0441 triton server. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0440\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0438\u0445 \u0441\u0442\u0430\u0442\u0443\u0441:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/578\/22b\/cdc\/57822bcdc8a1ac70eca049ad4653d97a.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/578\/22b\/cdc\/57822bcdc8a1ac70eca049ad4653d97a.png\"\/><\/div>\n<p>  \u0412 \u043b\u043e\u0433\u0430\u0445 \u043f\u043e\u0434\u0430 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/957\/71b\/195\/95771b195dca2400b832ab86eb46d371.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/957\/71b\/195\/95771b195dca2400b832ab86eb46d371.png\"\/><\/div>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b GPU \u0432 \u043d\u043e\u0434\u0435:<\/p>\n<pre><code class=\"bash\">kubectl describe nodes\/&lt;node name> <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/b7f\/e75\/113\/b7fe75113d1fab851f8698d8d14bdc99.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b7f\/e75\/113\/b7fe75113d1fab851f8698d8d14bdc99.png\"\/><\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u0434\u0430 \u0438\u0437 \u0441\u0435\u043c\u0438. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u0445 MIG:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/849\/2b1\/2f3\/8492b12f3800bff9fe42ed6e2ee40c93.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/849\/2b1\/2f3\/8492b12f3800bff9fe42ed6e2ee40c93.png\"\/><\/div>\n<p>  \u0412\u0441\u0435 \u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u043c MIG. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 GPU \u0434\u043e 7 \u043f\u043e\u0434\u043e\u0432, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 A100.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 deployment, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c triton server \u0434\u043e \u0441\u0435\u043c\u0438 \u043f\u043e\u0434\u043e\u0432:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/3d2\/85c\/b53\/3d285cb53a5630ca14a9634b66596cf9.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3d2\/85c\/b53\/3d285cb53a5630ca14a9634b66596cf9.png\"\/><\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u0448 demo-\u0441\u0442\u0435\u043d\u0434 \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/748544\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h3>\n<p>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 Kubernetes, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 triton server. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u044f \u0432\u0437\u044f\u043b <a href=\"https:\/\/developer.nvidia.com\/blog\/deploying-nvidia-triton-at-scale-with-mig-and-kubernetes\/\">\u0441\u0442\u0430\u0442\u044c\u044e \u043e\u0442 Nvidia<\/a>, \u043e\u0431\u043d\u043e\u0432\u0438\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0433\u043e\u0434\u0430. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0445\u0435\u043c\u0435 \u043d\u0438\u0436\u0435, \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u0447\u0435\u0440\u0435\u0437 Load Balancer (\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ui\/ru\/4j\/uiru4jzdt9f78bmvzmaa1rynasq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ui\/ru\/4j\/uiru4jzdt9f78bmvzmaa1rynasq.png\"\/><\/div>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0442\u0438\u043f\u043e\u043c Load Balancer. \u0422\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u043f\u043e\u0440\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 HTTP \u0438 GRPC. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u043f\u043e \u043d\u0438\u043c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u044b):<\/p>\n<pre><code class=\"bash\">kubectl apply -f pod-sharing-example\/service-triton.yaml <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">apiVersion: v1 kind: Service metadata: name: tritonserver labels:   app: tritonserver spec: selector:   app: tritonserver ports:   - protocol: TCP     port: 8000     name: http     targetPort: 8000   - protocol: TCP     port: 8001     name: grpc     targetPort: 8001   - protocol: TCP     port: 8002     name: metrics     targetPort: 8002 type: LoadBalancer <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f (\u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043e\u0431\u043b\u0430\u043a\u0430 Selectel):<\/p>\n<pre><code class=\"bash\">kubectl get svc <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/bc4\/aa2\/8b8\/bc4aa28b84ef1efe4c692bd7b0b0ad1a.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bc4\/aa2\/8b8\/bc4aa28b84ef1efe4c692bd7b0b0ad1a.png\"\/><\/div>\n<p>  \u0421\u0443\u043f\u0435\u0440 \u2014 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d. \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440-\u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/748544\/comments\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 (\u0432\u043d\u0435\u0448\u043d\u0438\u0439 IP \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u043e\u043b\u0435 external-ip). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2014 <a href=\"https:\/\/arxiv.org\/abs\/1608.06993\">densenet_onnx<\/a>.<\/p>\n<pre><code class=\"bash\">docker run -it --rm nvcr.io\/nvidia\/tritonserver:23.05-py3-sdk \/workspace\/install\/bin\/image_client -m densenet_onnx -c 3 -s INCEPTION -i http -u 5.188.81.52:8000 \/workspace\/images\/mug.jpg <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043a\u0440\u0443\u0436\u043a\u043e\u0439 \u043a\u043e\u0444\u0435 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"plaintext\"># Inference should return the following Image '\/workspace\/images\/mug.jpg':     15.346230 (504) = COFFEE MUG     13.224326 (968) = CUP     10.422965 (505) = COFFEEPOT <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Prometheus.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044e Prometheus Operator, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/selectel.ru\/blog\/tutorials\/monitoring-in-k8s-with-prometheus\/\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>:<\/p>\n<pre><code class=\"bash\">helm repo add prometheus-community https:\/\/prometheus-community.github.io\/helm-charts helm repo update helm search repo prometheus-community kubectl create namespace monitoring helm install kube-prom-stack prometheus-community\/kube-prometheus-stack -n monitoring <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c PodMonitor, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 triton \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u0432 Prometheus:<\/p>\n<pre><code class=\"bash\">kubectl apply -f monitoring\/pod-monitor-triton.yaml <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">apiVersion: monitoring.coreos.com\/v1 kind: PodMonitor metadata: name: kube-prometheus-stack-tritonmetrics namespace: monitoring labels:     release: kube-prom-stack spec:  selector:     matchLabels:        app: tritonserver  namespaceSelector:     matchNames:        - default  podMetricsEndpoints:    - port: metrics-triton      interval: 10s      path: \/metrics <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c Prometheus:<\/p>\n<pre><code class=\"plaintext\">kubectl rollout restart statefulset prometheus-kube-prom-stack-kube-prome-prometheus <\/code><\/pre>\n<p>  \u0412 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Prometheus (\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 kubectl port forward) \u0432 \u0442\u0430\u0440\u0433\u0435\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/2b3\/1b4\/88d\/2b31b488d3955c4dd1aa8639c5764b4c.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2b3\/1b4\/88d\/2b31b488d3955c4dd1aa8639c5764b4c.png\"\/><\/div>\n<p>  \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043d\u0430\u0448 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 NVIDIA Triton \u2014 nv_inference_request_success. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 0. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0434\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u043e\u0434\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0432\u0441\u044e \u043d\u0430\u0448\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/666\/38c\/485\/66638c4851459b4d0af54dc4e232faa9.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/666\/38c\/485\/66638c4851459b4d0af54dc4e232faa9.png\"\/><\/div>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 (\u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440). \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"bash\">avg(delta(nv_inference_queue_duration_us[30s])\/(1+delta(nv_inference_request_success[30s]))) <\/code><\/pre>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e \u2014 \u0441\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d, MIG \u0432 Kubernetes \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d.<\/p>\n<p>  <b>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:<\/b><\/p>\n<p>  \u00a0<a href=\"https:\/\/slc.tl\/qei1a\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0i\/ij\/la\/0iijla9lyii29jg-xcp3jazdctc.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/0i\/ij\/la\/0iijla9lyii29jg-xcp3jazdctc.png\"\/><\/a>\u00a0<a href=\"https:\/\/slc.tl\/kddoh\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gt\/qs\/vy\/gtqsvy4lzlikeco4nraqsyh8qcw.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/gt\/qs\/vy\/gtqsvy4lzlikeco4nraqsyh8qcw.png\"\/><\/a>\u00a0<a href=\"https:\/\/slc.tl\/yd22h\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wb\/hz\/gi\/wbhzgifvkf3dcnukfocyiugvooi.png\" width=\"32%\" data-src=\"https:\/\/habrastorage.org\/webt\/wb\/hz\/gi\/wbhzgifvkf3dcnukfocyiugvooi.png\"\/><\/a><\/p>\n<p>  <a name=\"5\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0410\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/h2>\n<p><\/font>  <\/p>\n<h3>Prometheus Adapter<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c <a href=\"https:\/\/github.com\/kubernetes-sigs\/prometheus-adapter\">Prometheus Adapter<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 Kubernetes \u0438 \u0441\u0430\u043c\u0438\u043c Prometheus. \u041e\u043d \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0438\u0437 Prometheus \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u043c. \u042d\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c API \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b HPA.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/kb\/m0\/cl\/kbm0clzc9keynnrtzyy8o77hobw.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/kb\/m0\/cl\/kbm0clzc9keynnrtzyy8o77hobw.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u044f \u0432\u044b\u0434\u0430\u043b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a Kubernetes \u0434\u043b\u044f Prometheus Adapter, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u042f \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"plaintext\">kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --user=admin --user=kubelet --group=system:serviceaccounts <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 RBAC \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/rbac\/\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kubernetes<\/a> \u0438 <a href=\"https:\/\/docs.selectel.ru\/cloud\/managed-kubernetes\/clusters\/rbac-authorization\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Selectel<\/a>.<\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443, CustomMetric<\/h3>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<code>avg_time_queue_us<\/code>) \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u0432 <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/configmap\/\">ConfigMap<\/a>, \u0447\u0442\u043e\u0431\u044b <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">HPA<\/a> \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u0440\u0433\u0435\u0442\u0443.<\/p>\n<p>  \u0421\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c ConfigMap \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<ul>\n<li><code>nv_inference_request_success[30]<\/code> \u2014 \u0447\u0438\u0441\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434,<\/li>\n<li><code>nv_inference_queue_duration_us<\/code> \u2014 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 <code>avg_time_queue_us<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0438\u0436\u0435, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 HPA \u0440\u0435\u0448\u0430\u0435\u0442, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0448 ConfigMap \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1 kind: ConfigMap metadata: name: adapter-config namespace: monitoring data: triton-adapter-config.yml: |   rules:   - seriesQuery: 'nv_inference_queue_duration_us{namespace=\"default\",pod!=\"\"}'     resources:       overrides:         namespace: {resource: \"namespace\"}         pod: {resource: \"pod\"}     name:       matches: \"nv_inference_queue_duration_us\"       as: \"avg_time_queue_us\"     metricsQuery: 'avg(delta(nv_inference_queue_duration_us{&lt;&lt;.LabelMatchers>>}[30s])\/(1+delta(nv_inference_request_success{&lt;&lt;.LabelMatchers>>}[30s]))) by (&lt;&lt;.GroupBy>>)' <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0414\u0435\u043f\u043b\u043e\u0438\u043c Prometheus Adapter<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b HPA \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c Deployment, Service, \u0438 <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/extend-kubernetes\/setup-extension-api-server\/\">APIService<\/a> \u0434\u043b\u044f Prometheus Adapter. \u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0437 \u043d\u0438\u0445 \u0438 \u0434\u0430\u043b\u0435\u0435 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e Deployment, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 ConfigMap \u0438 Prometheus (\u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0432 \u043d\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 <code>--prometheus-url<\/code> \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 config-\u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0432\u044b\u0448\u0435):<\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1 kind: Deployment metadata:  name: triton-custom-metrics-apiserver  namespace: monitoring  labels:    app: triton-custom-metris-apiserver spec:  replicas: 1  selector:   matchLabels:     app: triton-custom-metrics-apiserver  template:   metadata:     labels:       app: triton-custom-metrics-apiserver   spec:     containers:     - name: custom-metrics-server       image: registry.k8s.io\/prometheus-adapter\/prometheus-adapter:v0.11.0       args:       - --cert-dir=\/tmp       - --prometheus-url=http:\/\/kube-prom-stack-kube-prome-prometheus:9090\/       - --metrics-relist-interval=30s       - --config=\/etc\/config\/triton-adapter-config.yml       - --secure-port=6443       ports:       - name: main-port         containerPort: 6443       volumeMounts:       - name: config-volume         mountPath: \/etc\/config         readOnly: false     volumes:     - name: config-volume       configMap:         name: adapter-config <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 Service \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e Deployment:<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1 kind: Service metadata:  name: triton-custom-metrics-api  namespace: monitoring spec:  selector:   app: triton-custom-metrics-apiserver  ports:  - port: 443    targetPort: 6443 <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c APIService, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c API \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c. API \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 custom.metrics.k8s.io\/v1beta1. \u0422\u0430\u043a HPA \u0441\u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u0434 \u043d\u0438\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c APIService, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443:<\/p>\n<pre><code class=\"plaintext\">apiVersion: apiregistration.k8s.io\/v1 kind: APIService metadata:  name: v1beta1.custom.metrics.k8s.io spec:  groupPriorityMinimum: 100  group: custom.metrics.k8s.io  insecureSkipTLSVerify: true  service:    name: triton-custom-metrics-api    namespace: monitoring  version: v1beta1  versionPriority: 5 <\/code><\/pre>\n<p>  \u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c \u043d\u0430\u0448\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>kubectl apply -f<\/code> \u2014 \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e API:<\/p>\n<pre><code class=\"json\">gpu-sharing-k8s git:(main) $ kubectl get --raw \"\/apis\/custom.metrics.k8s.io\/v1beta1\" | jq                        {   \"kind\": \"APIResourceList\",   \"apiVersion\": \"v1\",   \"groupVersion\": \"custom.metrics.k8s.io\/v1beta1\",   \"resources\": [     {       \"name\": \"pods\/avg_time_queue_us\",       \"singularName\": \"\",       \"namespaced\": true,       \"kind\": \"MetricValueList\",       \"verbs\": [         \"get\"       ]     },     {       \"name\": \"namespaces\/avg_time_queue_us\",       \"singularName\": \"\",       \"namespaced\": false,       \"kind\": \"MetricValueList\",       \"verbs\": [         \"get\"       ]     }   ] } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043f\u043e\u0434\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438:<\/p>\n<pre><code class=\"json\">gpu-sharing-k8s git:(main) $ kubectl get --raw \/apis\/custom.metrics.k8s.io\/v1beta1\/namespaces\/default\/pods\/%2A\/avg_time_queue_us | jq . {   \"kind\": \"MetricValueList\",   \"apiVersion\": \"custom.metrics.k8s.io\/v1beta1\",   \"metadata\": {},   \"items\": [     {       \"describedObject\": {         \"kind\": \"Pod\",         \"namespace\": \"default\",         \"name\": \"tritonserver-595c7df85f-bnplq\",         \"apiVersion\": \"\/v1\"       },       \"metricName\": \"avg_time_queue_us\",       \"timestamp\": \"2023-08-17T15:21:53Z\",       \"value\": \"399300m\",       \"selector\": null     },     {       \"describedObject\": {         \"kind\": \"Pod\",         \"namespace\": \"default\",         \"name\": \"tritonserver-595c7df85f-gp5k9\",         \"apiVersion\": \"\/v1\"       },       \"metricName\": \"avg_time_queue_us\",       \"timestamp\": \"2023-08-17T15:21:53Z\",       \"value\": \"0\",       \"selector\": null     },     {       \"describedObject\": {         \"kind\": \"Pod\",         \"namespace\": \"default\",         \"name\": \"tritonserver-595c7df85f-mpxhn\",         \"apiVersion\": \"\/v1\"       },       \"metricName\": \"avg_time_queue_us\",       \"timestamp\": \"2023-08-17T15:21:53Z\",       \"value\": \"4275m\",       \"selector\": null     }   ] } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u043e\u0434 tritonserver-595c7df85f-mpxhn \u0432\u0435\u0440\u043d\u0443\u043b \u043c\u0435\u0442\u0440\u0438\u043a\u0443, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u044b\u043b\u0430\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u043e \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438.<\/p>\n<h3>Horizontal Pod Autoscaling<\/h3>\n<p>  HPA \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0448\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/7d5\/638\/4b5\/7d56384b5f57449589223fc77b44c9e5.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7d5\/638\/4b5\/7d56384b5f57449589223fc77b44c9e5.png\"\/><\/div>\n<ul>\n<li>R \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a,<\/li>\n<li>CR \u2014 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a,<\/li>\n<li>CV \u2014 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u0441\u043e \u0432\u0441\u0435\u0445 \u0440\u0435\u043f\u043b\u0438\u043a, <\/li>\n<li>DV \u2014 \u043f\u043e\u0440\u043e\u0433 \u043c\u0435\u0442\u0440\u0438\u043a\u0438.<\/li>\n<\/ul>\n<p>  \u041a\u043e\u0433\u0434\u0430 R \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 CR, HPA \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a, \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u043d\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0432 Kubernetes. \u041f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/e28\/23e\/012\/e2823e0121a255933624607a25ef3a97.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e28\/23e\/012\/e2823e0121a255933624607a25ef3a97.png\"\/><\/div>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430 HPA \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Deployment \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 HPA, \u0433\u0434\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 Deployment, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0435\u0435 \u043f\u043e\u0440\u043e\u0433, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 HPA \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u043f\u043b\u0438\u043a. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>kubectl apply -f.<\/code><\/p>\n<pre><code class=\"plaintext\">apiVersion: autoscaling\/v2 kind: HorizontalPodAutoscaler metadata:  name: tritonserver-hpa spec:  scaleTargetRef:    apiVersion: apps\/v1    kind: Deployment    name: tritonserver  minReplicas: 1  maxReplicas: 7  metrics:  - type: Pods    pods:      metric:        name: avg_time_queue_us      target:        type: AverageValue        averageValue: 50 <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u043d\u0443\u0442 \u0441\u043f\u0430\u043c\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043d\u0430 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440, HPA \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u043f\u043b\u0438\u043a, \u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0447\u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0441\u043d\u0438\u0437\u0438\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/selectel\/articles\/748544\/%233\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 60 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"bash\">perf_client -i http -u triton-server -m densenet_onnx --concurrency-range 60:100 <\/code><\/pre>\n<p>  \u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0440\u043e\u0441 \u0434\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, HPA \u043d\u0430\u0447\u0430\u043b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430:<\/p>\n<pre><code class=\"bash\">kubectl describe hpa tritonserver-hpa <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/9c2\/efd\/815\/9c2efd81588e8294307973f323282bc5.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9c2\/efd\/815\/9c2efd81588e8294307973f323282bc5.png\"\/><\/div>\n<p>  \u041d\u043e \u0441 MIG \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u0441\u0435\u043c\u044c \u0440\u0435\u043f\u043b\u0438\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430\u0448\u0443 GPU A100 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0441\u0443\u0440\u0441 GPU.<\/p>\n<p>  \u041d\u043e \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u043f\u043b\u0438\u043a \u0432 Kubernetes? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TimeSlicing.<\/p>\n<p>  <a name=\"6\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u041a\u0430\u043a \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c GPU-\u0440\u0435\u0441\u0443\u0440\u0441\u044b Kubernetes \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TimeSlicing<\/h2>\n<p><\/font><br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 \u043d\u043e\u0434\u0443 \u0441 GPU Tesla T4. \u0422\u0430\u043a\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 MIG, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u043e\u0432 \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u041d\u043e Nvidia \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0448\u0435\u0440\u0438\u043d\u0433\u0430 GPU \u0432 Kubernetes \u2014 TimeSlicing. \u0421 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u043c\u044b \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e GPU A100 \u0438 A30.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u043d\u043e\u0434 \u0441 GPU Tesla T4. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 flavor \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/5db\/ff3\/b73\/5dbff3b731bc6b8dc8e269a29b0d5ed2.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5db\/ff3\/b73\/5dbff3b731bc6b8dc8e269a29b0d5ed2.png\"\/><\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u043e\u0434:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/30b\/89d\/6ec\/30b89d6ec9f3e72aff10e72a5a6288da.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/30b\/89d\/6ec\/30b89d6ec9f3e72aff10e72a5a6288da.png\"\/><\/div>\n<p>  \u041d\u043e\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 kubectl:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/fa6\/5c5\/f9b\/fa65c5f9b94e51ded6e1e26925cf91df.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fa6\/5c5\/f9b\/fa65c5f9b94e51ded6e1e26925cf91df.png\"\/><\/div>\n<p>  <\/p>\n<blockquote><p>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 TimeSlicing \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 GPU \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e <a href=\"https:\/\/docs.nvidia.com\/datacenter\/cloud-native\/gpu-operator\/latest\/gpu-sharing.html\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p><\/blockquote>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c ConfigMap, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f GPU. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 TimeSlicing \u0432\u044b\u0434\u0435\u043b\u0438\u0442 \u0441\u0432\u043e\u0439 \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445), \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0449\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c GPU. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442 \u043f\u043e \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f OutOfMemory Error (OOM), \u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u0442 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 GPU.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u043d\u0430\u0448 Helm-\u0440\u0435\u043b\u0438\u0437. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0430 Tesla T4 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0441\u0443\u0440\u0441 nvidia.com\/gpu:<\/p>\n<pre><code class=\"bash\">kubectl get node &lt;node name> -o json | jq '.status.allocatable <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/c24\/cdc\/07e\/c24cdc07e4fbc76516a8113ae11c63e3.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c24\/cdc\/07e\/c24cdc07e4fbc76516a8113ae11c63e3.png\"\/><\/div>\n<p>  \u0412\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 ConfigMap, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c GPU \u043d\u0430 14 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1 kind: ConfigMap metadata:  name: time-slicing-config-fine  namespace: kube-system data:  tesla-t4: |-    version: v1    flags:      migStrategy: none    sharing:      timeSlicing:        resources:        - name: nvidia.com\/gpu          replicas: 14 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448 \u0440\u0435\u043b\u0438\u0437 GPU-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0443\u043a\u0430\u0437\u0430\u0432 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:<\/p>\n<pre><code class=\"bash\">helm upgrade --install --wait \\     -n kube-system &lt;release-name> \\     nvidia\/gpu-operator \\     -set devicePlugin.config.name=time-slicing-config-fine <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c TimeSlicing, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u0435\u0439\u0431\u043b \u043d\u0430 \u043d\u043e\u0434\u0443:<\/p>\n<pre><code class=\"json\">kubectl label node &lt;node-name> nvidia.com\/device-plugin.config=tesla-t4 <\/code><\/pre>\n<p>  \u0412 \u043b\u043e\u0433\u0430\u0445 nvidia-device-plugin \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"plaintext\">\"deviceListStrategy\": [ \"envvar\" ], \"deviceIDStrategy\": \"uuid\", \"cdiAnnotationPrefix\": \"cdi.k8s.io\/\", \"nvidiaCTKPath\": \"\/usr\/bin\/nvidia-ctk\", \"containerDriverRoot\": \"\/host\" } }, \"resources\": { \"gpus\": [ { \"pattern\": \"*\", \"name\": \"nvidia.com\/gpu\" } ], \"mig\": [ { \"pattern\": \"*\", \"name\": \"nvidia.com\/gpu\" } ] }, \"sharing\": { \"timeSlicing\": { \"resources\": [ { \"name\": \"nvidia.com\/gpu\", \"devices\": \"all\", \"replicas\": 14 } ] } } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0438\u0437 \u043b\u043e\u0433\u043e\u0432, \u043f\u043b\u0430\u0433\u0438\u043d\u0443 \u0432\u044b\u0434\u0430\u043d\u044b \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u043f\u043b\u0438\u043a (<code>sharing[\u2018timeslicing\u2019]<\/code>). \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 nvidia.com\/gpu \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/947\/805\/9bf\/9478059bf6fe2b95d0f95b191c38a7a7.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/947\/805\/9bf\/9478059bf6fe2b95d0f95b191c38a7a7.png\"\/><\/div>\n<p>  \u0421\u0443\u043f\u0435\u0440 \u2014 \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0430\u043d\u0443\u043b\u0438 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u043e 14 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u043e\u0432 \u043d\u0430 \u043d\u043e\u0434\u0435 \u0441 GPU Tesla T4. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u043b\u0438 \u0441\u0435\u0431\u044f \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 OOM.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448 Deployment \u043d\u0430 \u044d\u0442\u043e\u0439 \u043d\u043e\u0434\u0435 \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1 kind: Deployment metadata: name: tritonserver-teslat4 labels:   app: tritonserver-teslat4 spec: replicas: 4 selector:   matchLabels:     app: tritonserver-teslat4 template:   metadata:     labels:       app: tritonserver-teslat4   spec:     volumes:     - name: models       nfs:         server: 10.222.1.60         path: \/shares\/share-3010a65e-124c-4ac8-b08e-a7b2eae0b78c\/server\/docs\/examples\/model_repository         readOnly: false     nodeSelector:       nvidia.com\/gpu.product: Tesla-T4-SHARED     containers:       - name: tritonserver-teslat4         ports:         - containerPort: 8000           name: http-triton         - containerPort: 8001           name: grpc-triton         - containerPort: 8002           name: metrics-triton         image: \"nvcr.io\/nvidia\/tritonserver:23.05-py3\"         volumeMounts:         - mountPath: \/models           name: models         command: [\"\/bin\/sh\", \"-c\"]         args: [\"\/opt\/tritonserver\/bin\/tritonserver --model-repository=\/models --allow-gpu-metrics=false\"]         resources:           limits:             nvidia.com\/gpu: 1 <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">kubectl get deployments <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/68b\/e4f\/fed\/68be4ffed84e602d39ceeb283cb51f5f.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/68b\/e4f\/fed\/68be4ffed84e602d39ceeb283cb51f5f.png\"\/><\/div>\n<p>  \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u2014 \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u043b\u043e\u0433\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 GPU \u0447\u0435\u0440\u0435\u0437 nvidia-smi \u043d\u0430 \u043d\u043e\u0434\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/67c\/4c3\/6e0\/67c4c36e095fc6f9a6c5512c2078881c.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/67c\/4c3\/6e0\/67c4c36e095fc6f9a6c5512c2078881c.png\"\/><\/div>\n<p>  \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 GPU, \u043d\u043e \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0432, \u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043c \u043b\u0438\u043c\u0438\u0442 \u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 OOM.<\/p>\n<h3>\u041a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 OOM?<\/h3>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u043e \u043c\u043e\u0433\u0443 \u0434\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u043f\u0430\u0440\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 OOM \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 TimeSlicing:<\/p>\n<p>  1. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u044c\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 Tensorflow, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 <a href=\"https:\/\/www.tensorflow.org\/guide\/gpu?hl=ru%23limiting_gpu_memory_growth\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  2. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u044c\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 runtime. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 <a href=\"https:\/\/onnxruntime.ai\/\">onnx runtime<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u0449\u0438\u0442\u0435 \u043f\u043e <a href=\"https:\/\/onnxruntime.ai\/docs\/execution-providers\/CUDA-ExecutionProvider.html\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>  3. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <a href=\"https:\/\/docs.nvidia.com\/deploy\/mps\/index.html\">CUDA Multi-Process Service (MPS)<\/a>. \u0421\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443: \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0442 Nvidia \u0435\u0449\u0435 \u043d\u0435\u0442. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/nebuly-ai\/k8s-device-plugin\">\u0444\u043e\u0440\u043a nvidia-device-plugin<\/a>.<\/p>\n<p>  4. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 MIG, \u0442\u043e\u0433\u0434\u0430 OOM \u0431\u0443\u0434\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0435\u0439. \u0414\u0430, \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0435\u043c\u044c \u0447\u0430\u0441\u0442\u0435\u0439 GPU, \u043d\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0431\u043b\u0438\u0436\u0435.<\/p>\n<h3>\u041a\u043e\u043b\u043b\u0430\u0431\u043e\u0440\u0430\u0446\u0438\u044f \u0432\u0435\u043a\u0430, \u0438\u043b\u0438 TimeSlicing \u0432 MIG<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/73f\/97d\/61e\/73f97d61ea24adb4a51921fdf8d56b56.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/73f\/97d\/61e\/73f97d61ea24adb4a51921fdf8d56b56.png\"\/><\/div>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u00ab\u0432\u043f\u0438\u0445\u043d\u0443\u0442\u044c\u00bb \u0432 \u0448\u0435\u0440\u0438\u043d\u0433 GPU \u043f\u043e MIG \u0448\u0435\u0440\u0438\u043d\u0433 GPU \u043f\u043e TimeSlicing.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u043d\u043e\u0434\u0443 A100 \u0447\u0435\u0440\u0435\u0437 mixed-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 1g.5gb \u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 2g.10gb \u0438 3g.20gb. \u0418 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TimeSlicing \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (<code>replicas<\/code>) \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a ConfigMap, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f TimeSlicing \u0441 Tesla T4. \u0421\u0443\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435: \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 MIG.<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1 kind: ConfigMap metadata:  name: time-slicing-config-mig  namespace: kube-system data:  a100-40gb: |-    version: v1    flags:      migStrategy: mixed    sharing:      timeSlicing:        resources:        - name: nvidia.com\/gpu          replicas: 3        - name: nvidia.com\/mig-1g.5gb          replicas: 4        - name: nvidia.com\/mig-2g.10gb          replicas: 3        - name: nvidia.com\/mig-3g.20gb          replicas: 4        - name: nvidia.com\/mig-7g.40gb          replicas: 7 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 GPU, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e MIG \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u043e\u0432\u044b\u0439 ConfigMap:<\/p>\n<pre><code class=\"bash\">helm upgrade --install --wait \\                                                                      -n kube-system gpu-operator-1691669985 \\     nvidia\/gpu-operator \\     --set mig.strategy=mixed --set devicePlugin.config.name=time-slicing-config-mig <\/code><\/pre>\n<p>  \u0423\u043a\u0430\u0436\u0435\u043c \u0434\u043b\u044f nvidia-device-plugin, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c config a100-40gb \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e ConfigMap:<\/p>\n<pre><code class=\"plaintext\">kubectl label node &lt;node name> nvidia.com\/device-plugin.config=a100-40gb --overwrite <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0434\u0435\u0441\u044f\u0442\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e MIG, \u0440\u0430\u0437\u0431\u0438\u0432 A100 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"plaintext\">kubectl label node &lt;node name> nvidia.com\/mig.config=all-balanced --overwrite <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"plaintext\">kubectl get node &lt;node name> -o json | jq '.status.allocatable <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/e3c\/8d4\/a30\/e3c8d4a302c5837feddfe6f9831fcc68.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e3c\/8d4\/a30\/e3c8d4a302c5837feddfe6f9831fcc68.png\"\/><\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u043c \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 TimeSlicing. \u0423\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0435\u043f\u043b\u0438\u043a 1g.5gb, \u0442\u0440\u0438 2g.10gb \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 3g.20gb.<\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0435\u043c\u0438 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 A100 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c MIG. \u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043c triton server, \u0441\u043b\u0435\u0433\u043a\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 Deployment. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044e \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e 1g.5gb:<\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1 kind: Deployment metadata: name: tritonserver-timeslicing-mig labels:   app: tritonserver-timeslicing-mig spec: replicas: 8 selector:   matchLabels:     app: tritonserver-timeslicing-mig template:   metadata:     labels:       app: tritonserver-timeslicing-mig   spec:     volumes:     - name: models       nfs:         server: 10.222.1.60         path: \/shares\/share-3010a65e-124c-4ac8-b08e-a7b2eae0b78c\/server\/docs\/examples\/model_repository         readOnly: false     containers:       - name: tritonserver-timeslicing-mig         ports:         - containerPort: 8000           name: http-triton         - containerPort: 8001           name: grpc-triton         - containerPort: 8002           name: metrics-triton         image: \"nvcr.io\/nvidia\/tritonserver:23.05-py3\"         volumeMounts:         - mountPath: \/models           name: models         command: [\"\/bin\/sh\", \"-c\"]         args: [\"\/opt\/tritonserver\/bin\/tritonserver --model-repository=\/models --allow-gpu-metrics=false\"]         resources:           limits:             nvidia.com\/mig-1g.5gb: 1 <\/code><\/pre>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e \u2014 \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 nvidia.com\/mig-1g.5gb \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u0440\u043e\u0432\u043d\u043e \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0435\u043f\u043b\u0438\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/59c\/492\/f42\/59c492f42c9aa5c60dd14395b8792c66.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/59c\/492\/f42\/59c492f42c9aa5c60dd14395b8792c66.png\"\/><\/div>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0435\u043c\u044c \u0440\u0435\u043f\u043b\u0438\u043a \u043c\u043e\u0436\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0440\u043e OOM, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f TimeSlicing \u043c\u044b \u0440\u0438\u0441\u043a\u0443\u0435\u043c \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0443\u0436\u0435 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438.<\/p>\n<p>  <a name=\"7\"><\/a><font color=\"#EB4247\"><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><\/font><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0438\u0437\u0443\u0447\u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c MIG \u0438 TimeSlicing \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c GPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0448\u0435\u0440\u0438\u043d\u0433\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u0432 Kubernetes. \u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u2014 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 OOM.<\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441 \u0448\u0435\u0440\u0438\u043d\u0433\u043e\u043c GPU<\/h3>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 MIG \u0438 TimeSlicing \u0432 \u043d\u0430\u0448\u0435\u0439 ML-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 Jupyter-\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 ClearML. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435!<\/p>\n<blockquote><p>\u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c <a href=\"https:\/\/github.com\/selectel\/gpu-sharing-k8s\">GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0414\u0435\u043b\u0430\u0439\u0442\u0435 \u0444\u043e\u0440\u043a \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f!<\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/756934\/\"> https:\/\/habr.com\/ru\/articles\/756934\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/gk\/9m\/w1\/gk9mw1w-iekzg5-7e7jlhjxnq8s.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/gk\/9m\/w1\/gk9mw1w-iekzg5-7e7jlhjxnq8s.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0441\u043d\u043e\u0432\u0430 \u0410\u043d\u0442\u043e\u043d, DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 <a href=\"https:\/\/slc.tl\/w4syj\">Data- \u0438 ML-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 Selectel<\/a>. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0448\u0435\u0440\u0438\u043d\u0433\u0435 GPU \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MIG. \u0410 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b \u0442\u0435\u043c\u0443 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041e\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0448\u0435\u0440\u0438\u043d\u0433\u0430 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-353169","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=353169"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353169\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=353169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=353169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=353169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}