{"id":30752,"date":"2026-11-06T10:16:00","date_gmt":"2026-11-06T02:16:00","guid":{"rendered":"https:\/\/www.ixpower.cn\/?p=30752"},"modified":"2026-11-06T10:16:00","modified_gmt":"2026-11-06T02:16:00","slug":"hami%ef%bc%9agpu%e8%ae%be%e5%a4%87%e5%85%b1%e4%ba%ab%e5%ae%9e%e7%8e%b0%e6%9c%ba%e5%88%b6","status":"publish","type":"post","link":"https:\/\/www.ixpower.cn\/index.php\/2026\/11\/06\/30752\/","title":{"rendered":"HAMi\uff1aGPU\u8bbe\u5907\u5171\u4eab\u5b9e\u73b0\u673a\u5236"},"content":{"rendered":"<div class=\"article-desc\">HAMi \u8ba9\u591a\u4e2a Pod \u5171\u4eab\u540c\u4e00\u5f20\u7269\u7406 GPU\uff0c\u6309\u663e\u5b58\u548c\u7b97\u529b\u7cbe\u7ec6\u5206\u914d\u3002\u672c\u6587\u4ece\u6e90\u7801\u89d2\u5ea6\u62c6\u89e3\u8fd9\u6761\u94fe\u8def\uff1aPod \u63d0\u4ea4 \u2192 Webhook \u51c6\u5165 \u2192 \u8c03\u5ea6\u5668\u9009\u8282\u70b9\u9009\u8bbe\u5907 \u2192 \u8bbe\u5907\u63d2\u4ef6\u6ce8\u5165\u9694\u79bb\u5c42 \u2192 \u5bb9\u5668\u5185 CUDA API \u52ab\u6301\u3002<\/div>\n<div id=\"postspictures\" class=\"article-content\">\n<div id=\"container\" class=\"container am-engine\" data-v-01a18e2f=\"\" data-element=\"root\">\n<p><img data-dominant-color=\"546d95\" data-has-transparency=\"false\" style=\"--dominant-color: #546d95;\" loading=\"lazy\" decoding=\"async\" class=\"not-transparent alignnone size-full wp-image-30753\" src=\"https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1.png\" width=\"1248\" height=\"696\" srcset=\"https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1.png 1248w, https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1-300x167.png 300w, https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1-1024x571.png 1024w, https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1-150x84.png 150w, https:\/\/aiforumimage.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2026\/11\/285a03d5178b0ac5d5e8920ab14a2fa80cdef1-768x428.png 768w\" sizes=\"auto, (max-width: 1248px) 100vw, 1248px\" \/><\/p>\n<h2>\u4e00\u5f20 GPU \u600e\u4e48\u5206\u7ed9\u591a\u4e2a Pod<\/h2>\n<p>\u5148\u7528\u4e00\u4e2a\u5177\u4f53\u4f8b\u5b50\u5efa\u7acb\u76f4\u89c9\u3002<\/p>\n<p>\u8282\u70b9\u4e0a\u6709\u4e00\u5f20 NVIDIA A100\uff0880GB \u663e\u5b58\uff09\uff0c<code>DeviceSplitCount=10<\/code>\uff0c\u610f\u5473\u7740 HAMi \u628a\u8fd9\u5f20 GPU \u6ce8\u518c\u4e3a 10 \u4e2a&#8221;\u865a\u62df\u8bbe\u5907&#8221;\u7ed9 kubelet\u3002\u73b0\u5728\u4e24\u4e2a Pod \u5148\u540e\u6765\u7533\u8bf7\u8d44\u6e90\uff1a<\/p>\n<ul data-id=\"u738a58b-ESEleN6g\">\n<li data-id=\"ld70c578-25mD866G\">Pod A \u8bf7\u6c42 1 GPU\u300130GB \u663e\u5b58\u300150% \u7b97\u529b<\/li>\n<li data-id=\"ld70c578-fOW0hll7\">Pod B \u8bf7\u6c42 1 GPU\u300120GB \u663e\u5b58\u300130% \u7b97\u529b<\/li>\n<\/ul>\n<p>\u8c03\u5ea6\u5668\u5728\u5185\u5b58\u4e2d\u7ef4\u62a4\u6bcf\u4e2a\u8bbe\u5907\u7684\u7528\u91cf\u8d26\u672c\uff08<code>DeviceUsage<\/code>\uff09\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_0\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(line\r\nDeviceUsage {\r\n  Totalmem: 81920,  Usedmem: 0      \u2192 \u5206\u914d Pod A \u540e Usedmem=30720\r\n  Totalcore: 100,   Usedcores: 0    \u2192 \u5206\u914d Pod A \u540e Usedcores=50\r\n  Count: 10,        Used: 0         \u2192 \u5206\u914d Pod A \u540e Used=1\r\n}<\/code><\/pre>\n<ul id=\"code_id_0\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Pod A \u901a\u8fc7\u68c0\u67e5\uff08\u5269\u4f59\u663e\u5b58 51200 \u2265 30720\uff0c\u5269\u4f59\u7b97\u529b 50 \u2265 50\uff0c\u5206\u7247\u6570 9 &gt; 0\uff09\uff0c\u5206\u914d\u6210\u529f\u3002Pod B \u5230\u6765\u65f6\uff0c\u5269\u4f59\u663e\u5b58 51200 \u2265 20480\uff0c\u5269\u4f59\u7b97\u529b 50 \u2265 30\uff0c\u5206\u7247\u6570 8 &gt; 0\uff0c\u4e5f\u901a\u8fc7\u3002<\/p>\n<p>\u4f46\u5149\u5728\u8c03\u5ea6\u5668\u91cc\u8bb0\u8d26\u4e0d\u591f\u2014\u2014\u5bb9\u5668\u542f\u52a8\u540e\uff0cPod A \u7684\u8fdb\u7a0b\u51ed\u4ec0\u4e48\u53ea\u7528 30GB \u663e\u5b58\uff1f\u8fd9\u5c31\u662f HAMi \u7684\u4e24\u5c42\u673a\u5236\uff1a<strong>\u300c\u8c03\u5ea6\u5668\u505a\u8d44\u6e90\u8bb0\u8d26\u548c\u5206\u914d\u51b3\u7b56\uff0c\u5bb9\u5668\u5185\u901a\u8fc7\u00a0<\/strong><code><strong>libvgpu.so<\/strong><\/code><strong>\u00a0\u52ab\u6301 CUDA API \u505a\u786c\u9650\u5236\u300d<\/strong>\u3002<\/p>\n<h2>\u56db\u4e2a\u7ec4\u4ef6\u600e\u4e48\u534f\u4f5c<\/h2>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_1\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(line\r\nPod \u63d0\u4ea4\r\n  \u2192 [1] MutatingWebhook\uff1a\u62e6\u622a Pod\uff0c\u6ce8\u5165\u8c03\u5ea6\u5668\u540d\uff0c\u6821\u9a8c\u8d44\u6e90\u8bf7\u6c42\r\n  \u2192 [2] HAMi Scheduler\uff1a\u9009\u8282\u70b9 + \u9009\u8bbe\u5907\uff0c\u628a\u5206\u914d\u7ed3\u679c\u5199\u5165 Pod annotation\r\n  \u2192 [3] DevicePlugin\uff1a\u8bfb\u53d6 annotation\uff0c\u6ce8\u5165\u73af\u5883\u53d8\u91cf + \u6302\u8f7d libvgpu.so\r\n  \u2192 [4] libvgpu.so\uff1a\u5bb9\u5668\u542f\u52a8\u540e\u52ab\u6301 CUDA \u8c03\u7528\uff0c\u6267\u884c\u663e\u5b58\/\u7b97\u529b\u9650\u5236<\/code><\/pre>\n<ul id=\"code_id_1\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4e0b\u9762\u9010\u5c42\u62c6\u89e3\u3002<\/p>\n<h2>1. MutatingWebhook\uff1a\u51c6\u5165\u62e6\u622a<\/h2>\n<p><strong>\u300c\u5165\u53e3\u300d<\/strong>\uff1a<code>pkg\/scheduler\/webhook.go:53<\/code><code>Handle()<\/code><\/p>\n<p>Webhook \u62e6\u622a\u6240\u6709 Pod \u521b\u5efa\u8bf7\u6c42\uff0c\u505a\u4e09\u4ef6\u4e8b\uff1a<\/p>\n<p><strong>\u300ca) \u8d44\u6e90\u8bf7\u6c42\u89c4\u8303\u5316\u300d<\/strong><\/p>\n<p>\u8c03\u7528\u6bcf\u4e2a\u8bbe\u5907\u5382\u5546\u7684\u00a0<code>MutateAdmission()<\/code>\uff08<code>pkg\/device\/nvidia\/device.go:328<\/code>\uff09\u3002NVIDIA \u7684\u5b9e\u73b0\u5305\u62ec\uff1a<\/p>\n<ul data-id=\"u738a58b-hFgSX6k0\">\n<li data-id=\"ld70c578-N4CMaiVP\">\u9a8c\u8bc1\u663e\u5b58\u767e\u5206\u6bd4\uff080-100\uff09<\/li>\n<li data-id=\"ld70c578-KJbnDJY3\">\u5982\u679c\u5bb9\u5668\u53ea\u8bf7\u6c42\u4e86\u00a0<code>nvidia.com\/gpumem<\/code>\u00a0\u4f46\u6ca1\u8bf7\u6c42\u00a0<code>nvidia.com\/gpu<\/code>\uff0c\u81ea\u52a8\u8865\u4e0a count \u8d44\u6e90<\/li>\n<li data-id=\"ld70c578-cMN4iZH1\">\u5982\u679c\u8bf7\u6c42\u4e86 100% \u663e\u5b58\u4f46\u6ca1\u6307\u5b9a\u7b97\u529b\uff0c\u81ea\u52a8\u8bbe\u4e3a 100 \u6838\uff08\u72ec\u5360\u8bed\u4e49\uff09<\/li>\n<\/ul>\n<p><strong>\u300cb) \u6ce8\u5165\u8c03\u5ea6\u5668\u540d\u300d<\/strong><\/p>\n<p>\u5982\u679c Pod \u8bf7\u6c42\u4e86 HAMi \u7ba1\u7406\u7684\u8d44\u6e90\uff0c\u5c06\u00a0<code>pod.Spec.SchedulerName<\/code>\u00a0\u8bbe\u4e3a\u00a0<code>\"hami-scheduler\"<\/code>\uff08<code>webhook.go:107<\/code>\uff09\u3002\u8fd9\u6837 kube-scheduler \u624d\u4f1a\u628a Pod \u8f6c\u53d1\u7ed9 HAMi \u7684 extender\u3002<\/p>\n<p><strong>\u300cc) \u5b89\u5168\u68c0\u67e5\u300d<\/strong><\/p>\n<p>\u7279\u6743\u5bb9\u5668\u4e0d\u5141\u8bb8\u4f7f\u7528 GPU\uff08<code>webhook.go:99<\/code>\uff09\u3002\u56e0\u4e3a\u00a0<code>libvgpu.so<\/code>\u00a0\u7684\u62e6\u622a\u662f\u534f\u4f5c\u5f0f\u7684\uff0c\u7279\u6743\u5bb9\u5668\u53ef\u4ee5\u7ed5\u8fc7\u00a0<code>LD_PRELOAD<\/code>\uff0c\u6240\u4ee5\u76f4\u63a5\u5728\u51c6\u5165\u9636\u6bb5\u62d2\u7edd\u3002<\/p>\n<h2>2. HAMi Scheduler\uff1a\u8bbe\u5907\u611f\u77e5\u8c03\u5ea6<\/h2>\n<p><strong>\u300c\u5165\u53e3\u300d<\/strong>\uff1a<code>pkg\/scheduler\/scheduler.go:1009<\/code><code>Filter()<\/code><\/p>\n<p>HAMi \u4ee5 Kubernetes Scheduler Extender \u7684\u65b9\u5f0f\u8fd0\u884c\uff0c\u6ce8\u518c\u4e86\u00a0<code>\/filter<\/code>\u00a0\u548c\u00a0<code>\/bind<\/code>\u00a0\u4e24\u4e2a HTTP \u8def\u7531\u3002<strong>\u300c\u5173\u952e\u8bbe\u8ba1\uff1aFilter \u9636\u6bb5\u540c\u65f6\u5b8c\u6210 filter + score + node selection\uff0c\u76f4\u63a5\u8fd4\u56de\u5355\u4e2a\u8282\u70b9\u3002\u300d<\/strong><\/p>\n<h3>2.1 \u8bbe\u5907\u8d44\u6e90\u4ece\u54ea\u6765<\/h3>\n<p>\u8bbe\u5907\u63d2\u4ef6\u5728\u6bcf\u4e2a\u8282\u70b9\u4e0a\u8fd0\u884c\uff0c\u901a\u8fc7 NVML \u83b7\u53d6 GPU \u4fe1\u606f\uff0c\u6bcf 30 \u79d2\u5c06\u8bbe\u5907\u89c4\u683c\u5199\u5165\u8282\u70b9 annotation\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_2\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(line\r\nhami.io\/node-nvidia-register: GPU-xxx,10,81920,100,NVIDIA-A100-80GB,0,true:...<\/code><\/pre>\n<ul id=\"code_id_2\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u683c\u5f0f\uff1a<code>{UUID},{\u53ef\u5206\u7247\u6570},{\u663e\u5b58MB},{\u7b97\u529b%},{\u578b\u53f7},{NUMA},{\u5065\u5eb7}<\/code><\/p>\n<p>\u8c03\u5ea6\u5668\u7684\u00a0<code>RegisterFromNodeAnnotations()<\/code>\uff08<code>scheduler.go:404<\/code>\uff09\u6301\u7eed\u540c\u6b65\u8fd9\u4e9b\u4fe1\u606f\u5230\u5185\u5b58\u7f13\u5b58\u00a0<code>nodeManager<\/code>\u3002<\/p>\n<h3>2.2 \u8d44\u6e90\u8bf7\u6c42\u89e3\u6790<\/h3>\n<p><code>device.Resourcereqs()<\/code>\uff08<code>devices.go:636<\/code>\uff09\u904d\u5386 Pod \u7684\u6240\u6709\u5bb9\u5668\uff0c\u8c03\u7528\u6bcf\u4e2a\u5382\u5546\u7684\u00a0<code>GenerateResourceRequests()<\/code>\uff08<code>nvidia\/device.go:501<\/code>\uff09\uff0c\u4ece\u00a0<code>Resources.Limits<\/code>\u00a0\u4e2d\u89e3\u6790\u51fa\uff1a<\/p>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1045.82px\">\n<colgroup data-id=\"c7104f7d-UXeTSfB8\">\n<col span=\"1\" width=\"348.597\" data-id=\"cd89ecb0-4h93l7BJ\" \/>\n<col span=\"1\" width=\"348.597\" data-id=\"cd89ecb0-9KTXDj4d\" \/>\n<col span=\"1\" width=\"348.625\" data-id=\"cd89ecb0-9Ka3SlLR\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-kIgUHiMf\">\n<tr data-id=\"t31e458f-4adJhf7X\">\n<td data-id=\"t6267798-CeSCIOi6\" data-transient-attributes=\"table-cell-selection\">K8s \u8d44\u6e90\u540d<\/td>\n<td data-id=\"t6267798-hCPZQ9Vf\" data-transient-attributes=\"table-cell-selection\">\u542b\u4e49<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-h6EK2Tk9\" data-transient-attributes=\"table-cell-selection\">\u89e3\u6790\u7ed3\u679c<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-5XYGkY5g\">\n<td data-id=\"t6267798-RUV10C0E\" data-transient-attributes=\"table-cell-selection\"><code>nvidia.com\/gpu<\/code><\/td>\n<td data-id=\"t6267798-oWHRjTUY\" data-transient-attributes=\"table-cell-selection\">GPU \u6570\u91cf<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-2nTOeM2g\" data-transient-attributes=\"table-cell-selection\"><code>Nums<\/code><\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-DPm3jAS1\">\n<td data-id=\"t27933fe-8TgZHPAT\" data-transient-attributes=\"table-cell-selection\"><code>nvidia.com\/gpumem<\/code><\/td>\n<td data-id=\"t27933fe-L1D1VS0Y\" data-transient-attributes=\"table-cell-selection\">\u663e\u5b58\uff08MB\uff09<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-GkfDj8QJ\" data-transient-attributes=\"table-cell-selection\"><code>Memreq<\/code><\/td>\n<\/tr>\n<tr data-id=\"t31e458f-PCUCMj1W\">\n<td data-id=\"t6267798-RaSMMXQi\" data-transient-attributes=\"table-cell-selection\"><code>nvidia.com\/gpucores<\/code><\/td>\n<td data-id=\"t6267798-BYkiDnNj\" data-transient-attributes=\"table-cell-selection\">\u7b97\u529b\uff08%\uff09<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-6lrGb2tF\" data-transient-attributes=\"table-cell-selection\"><code>Coresreq<\/code><\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-CWjCQAWi\">\n<td class=\"table-last-column\" data-id=\"t27933fe-OSPBpILX\" data-transient-attributes=\"table-cell-selection\"><code>nvidia.com\/gpumem-percentage<\/code><\/td>\n<td class=\"table-last-column\" data-id=\"t27933fe-35gFMVSE\" data-transient-attributes=\"table-cell-selection\">\u663e\u5b58\u767e\u5206\u6bd4<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t27933fe-BHR9a7jE\" data-transient-attributes=\"table-cell-selection\"><code>MemPercentagereq<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2.3 \u8282\u70b9\u4f7f\u7528\u5feb\u7167<\/h3>\n<p><code>getNodesUsage()<\/code>\uff08<code>scheduler.go:720<\/code>\uff09\u6784\u5efa\u8c03\u5ea6\u65f6\u523b\u7684\u8bbe\u5907\u7528\u91cf\u5feb\u7167\uff1a<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-aeMWE26H\">\n<li data-id=\"ld70c578-MOM87mP5\">\u4ece\u00a0<code>nodeManager<\/code>\u00a0\u8bfb\u53d6\u6240\u6709\u8282\u70b9\u7684\u8bbe\u5907\u6ce8\u518c\u4fe1\u606f\uff0c\u521d\u59cb\u5316\u00a0<code>DeviceUsage<\/code>\uff08Used=0, Usedmem=0, Usedcores=0\uff09<\/li>\n<li data-id=\"ld70c578-QofSAjLT\">\u904d\u5386\u00a0<code>podManager<\/code>\u00a0\u4e2d\u6240\u6709\u5df2\u5206\u914d Pod\uff0c\u7d2f\u52a0\u4f7f\u7528\u91cf\uff1a<\/li>\n<\/ol>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_3\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">d.Device.Used++              \/\/ \u5206\u7247\u6570+1\r\nd.Device.Usedmem += udevice.Usedmem   \/\/ \u663e\u5b58\u7d2f\u52a0\r\nd.Device.Usedcores += udevice.Usedcores  \/\/ \u7b97\u529b\u7d2f\u52a0<\/code><\/pre>\n<ul id=\"code_id_3\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<ol start=\"3\" data-id=\"o2efa9a6-NhZZke0S\">\n<li data-id=\"ld70c578-lCrOSJXw\">\u8fd4\u56de\u5feb\u7167\u4f9b\u8bc4\u5206\u4f7f\u7528<\/li>\n<\/ol>\n<h3>2.4 \u8bc4\u5206\u4e0e\u8bbe\u5907\u5339\u914d<\/h3>\n<p><code>calcScore()<\/code>\uff08<code>score.go:342<\/code>\uff09\u5bf9\u6bcf\u4e2a\u8282\u70b9\u5e76\u53d1\u8bc4\u5206\u3002\u6838\u5fc3\u662f\u00a0<code>scoreNode()<\/code>\uff08<code>score.go:276<\/code>\uff09\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_4\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\nscoreNode():\r\n  1. \u4e3a init \u5bb9\u5668\u5206\u914d\u8bbe\u5907\uff08\u5728 node \u526f\u672c\u4e0a\u6a21\u62df\uff09\r\n  2. \u4e3a app \u5bb9\u5668\u5206\u914d\u8bbe\u5907\uff08\u5728\u53e6\u4e00\u4e2a node \u526f\u672c\u4e0a\u6a21\u62df\uff09\r\n  3. \u5408\u5e76\uff1ainit \u5bb9\u5668\u987a\u5e8f\u6267\u884c\uff0capp \u5bb9\u5668\u5e76\u884c\u6267\u884c\r\n     \u2192 \u6709\u6548\u4f7f\u7528\u91cf = max(init \u5cf0\u503c, app \u603b\u548c)\r\n  4. \u8ba1\u7b97\u8bc4\u5206<\/code><\/pre>\n<ul id=\"code_id_4\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8bbe\u5907\u7ea7\u5339\u914d\u5728\u00a0<code>fitInDevices()<\/code>\uff08<code>score.go:63<\/code>\uff09\u4e2d\u8c03\u7528\u5382\u5546\u7684\u00a0<code>Fit()<\/code>\u00a0\u65b9\u6cd5\u3002<\/p>\n<h3>2.5 NVIDIA Fit\uff1a\u9010\u8bbe\u5907\u68c0\u67e5<\/h3>\n<p><strong>\u300c<\/strong><code><strong>pkg\/device\/nvidia\/device.go:670<\/strong><\/code><strong>\u300d<\/strong><code>Fit()<\/code>\u00a0\u662f\u8bbe\u5907\u5171\u4eab\u8c03\u5ea6\u7684\u6838\u5fc3\u3002\u904d\u5386\u8282\u70b9\u4e0a\u7684\u6bcf\u5f20 GPU\uff0c\u6309\u4ee5\u4e0b\u987a\u5e8f\u68c0\u67e5\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_5\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\n\u5bf9\u6bcf\u5f20 GPU\uff1a\r\n  \u2460 \u5065\u5eb7\u68c0\u67e5        \u2192 dev.Health == true\r\n  \u2461 \u578b\u53f7\u5339\u914d        \u2192 checkType() \u5339\u914d annotation \u4e2d\u7684\u578b\u53f7\u8981\u6c42\r\n  \u2462 UUID \u8fc7\u6ee4       \u2192 \u652f\u6301 use-gpuuuid \/ nouse-gpuuuid\r\n  \u2463 \u5206\u7247\u6570\u68c0\u67e5      \u2192 dev.Count &gt; dev.Used\uff08\u5171\u4eab\u4efd\u6570\u672a\u7528\u5b8c\uff09\r\n  \u2464 \u4e92\u65a5\u7b56\u7565\u68c0\u67e5    \u2192 \u5982\u679c policy=mutex\uff0cdev.Used==0 \u624d\u53ef\u7528\r\n  \u2465 \u663e\u5b58\u68c0\u67e5        \u2192 dev.Totalmem - dev.Usedmem &gt;= memreq\r\n  \u2466 \u7b97\u529b\u68c0\u67e5        \u2192 dev.Totalcore - dev.Usedcores &gt;= coresreq\r\n  \u2467 \u72ec\u5360\u68c0\u67e5        \u2192 coresreq=100 \u4e14 dev.Used&gt;0 \u2192 \u8df3\u8fc7\r\n  \u2468 MIG \u68c0\u67e5        \u2192 CustomFilterRule() \u68c0\u67e5 profile \u548c placement\r\n  \u2469 \u914d\u989d\u68c0\u67e5        \u2192 fitQuota() \u68c0\u67e5 namespace \u7ea7\u914d\u989d<\/code><\/pre>\n<ul id=\"code_id_5\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5168\u90e8\u901a\u8fc7\u5219\u5206\u914d\u6210\u529f\uff0c\u8c03\u7528\u00a0<code>AddResourceUsage()<\/code>\u00a0\u7d2f\u52a0\u7528\u91cf\u3002<\/p>\n<h3>2.6 \u8c03\u5ea6\u7b56\u7565<\/h3>\n<p>\u4e24\u7ea7\u8c03\u5ea6\u7b56\u7565\uff0c\u53ef\u901a\u8fc7 Pod annotation \u8986\u76d6\uff1a<\/p>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1045.82px\">\n<colgroup data-id=\"c7104f7d-RTF9O4Al\">\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-c86cU9N5\" \/>\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-aQh6FDN6\" \/>\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-h3mKMD7o\" \/>\n<col span=\"1\" width=\"261.486\" data-id=\"cd89ecb0-H4C91U2Y\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-NYIhiYbh\">\n<tr data-id=\"t31e458f-9NoNYUeV\">\n<td data-id=\"t6267798-PqVj1MV2\" data-transient-attributes=\"table-cell-selection\">\u5c42\u7ea7<\/td>\n<td data-id=\"t6267798-HqOZWhIJ\" data-transient-attributes=\"table-cell-selection\">\u7b56\u7565<\/td>\n<td data-id=\"t6267798-gWIxtOA3\" data-transient-attributes=\"table-cell-selection\">\u884c\u4e3a<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-mvBFtV5F\" data-transient-attributes=\"table-cell-selection\">\u914d\u7f6e<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-pPAqkF4X\">\n<td data-id=\"t6267798-ujnV3NzA\" data-transient-attributes=\"table-cell-selection\">\u8282\u70b9\u7ea7<\/td>\n<td data-id=\"t6267798-Zxt4thbQ\" data-transient-attributes=\"table-cell-selection\"><code>binpack<\/code><\/p>\n<p>\uff08\u9ed8\u8ba4\uff09<\/td>\n<td data-id=\"t6267798-oBPX5OMT\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5148\u9009\u4f7f\u7528\u7387\u9ad8\u7684\u8282\u70b9<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-u1oNkqIb\" data-transient-attributes=\"table-cell-selection\"><code>--node-scheduler-policy<\/code><\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-nIMeNLDe\">\n<td data-id=\"t27933fe-jabKoqnr\" data-transient-attributes=\"table-cell-selection\">\u8282\u70b9\u7ea7<\/td>\n<td data-id=\"t27933fe-CqdlFnPV\" data-transient-attributes=\"table-cell-selection\"><code>spread<\/code><\/td>\n<td data-id=\"t27933fe-bPcIJdEr\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5148\u9009\u4f7f\u7528\u7387\u4f4e\u7684\u8282\u70b9<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-lAA3dAHu\" data-transient-attributes=\"table-cell-selection\"><\/td>\n<\/tr>\n<tr data-id=\"t31e458f-OpDGgVAI\">\n<td data-id=\"t6267798-RuvJgGTr\" data-transient-attributes=\"table-cell-selection\">\u8bbe\u5907\u7ea7<\/td>\n<td data-id=\"t6267798-d4Cxibvg\" data-transient-attributes=\"table-cell-selection\"><code>spread<\/code><\/p>\n<p>\uff08\u9ed8\u8ba4\uff09<\/td>\n<td data-id=\"t6267798-WRQTo6Gy\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5148\u9009\u7a7a\u95f2 GPU<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-h0BKTXmP\" data-transient-attributes=\"table-cell-selection\"><code>--gpu-scheduler-policy<\/code><\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-3p6oEDND\">\n<td data-id=\"t27933fe-rwrUwcKv\" data-transient-attributes=\"table-cell-selection\">\u8bbe\u5907\u7ea7<\/td>\n<td data-id=\"t27933fe-Yo5xqwT8\" data-transient-attributes=\"table-cell-selection\"><code>binpack<\/code><\/td>\n<td data-id=\"t27933fe-kgNx8yOV\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5148\u9009\u5df2\u5360\u7528\u7684 GPU<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-GmCmjp93\" data-transient-attributes=\"table-cell-selection\"><\/td>\n<\/tr>\n<tr data-id=\"t31e458f-VFXDVfBV\">\n<td data-id=\"t6267798-zk5mqQf6\" data-transient-attributes=\"table-cell-selection\">\u8bbe\u5907\u7ea7<\/td>\n<td data-id=\"t6267798-kHoDFzUw\" data-transient-attributes=\"table-cell-selection\"><code>mutex<\/code><\/td>\n<td data-id=\"t6267798-p9QzDfGP\" data-transient-attributes=\"table-cell-selection\">\u53ea\u9009\u5b8c\u5168\u7a7a\u95f2\u7684 GPU<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-UKafVO59\" data-transient-attributes=\"table-cell-selection\"><\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-h9NqWNjc\">\n<td class=\"table-last-column\" data-id=\"t27933fe-iy3xTKry\" data-transient-attributes=\"table-cell-selection\">\u8bbe\u5907\u7ea7<\/td>\n<td class=\"table-last-column\" data-id=\"t27933fe-4bzuT1tG\" data-transient-attributes=\"table-cell-selection\"><code>topology-aware<\/code><\/td>\n<td class=\"table-last-column\" data-id=\"t27933fe-gCkXV5Ue\" data-transient-attributes=\"table-cell-selection\">\u57fa\u4e8e GPU \u95f4 P2P \u62d3\u6251\u9009\u6700\u4f18\u7ec4\u5408<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t27933fe-NuN8DgE9\" data-transient-attributes=\"table-cell-selection\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2.7 \u5206\u914d\u7ed3\u679c\u5199\u5165 Pod annotation<\/h3>\n<p>\u8c03\u5ea6\u5668\u8c03\u7528\u00a0<code>PatchAnnotations()<\/code>\uff08<code>nvidia\/device.go:486<\/code>\uff09\u5c06\u5206\u914d\u7ed3\u679c\u5199\u5165 Pod annotation\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_6\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(line\r\nhami.io\/vgpu-devices-to-allocate: GPU-xxx,NVIDIA,3000,50:;GPU-yyy,NVIDIA,2000,30:;\r\nhami.io\/vgpu-node: node-1\r\nhami.io\/vgpu-time: 1705054796<\/code><\/pre>\n<ul id=\"code_id_6\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u683c\u5f0f\uff1a<code>{UUID},{\u7c7b\u578b},{\u663e\u5b58MB},{\u7b97\u529b%}:<\/code>\u00a0\u6bcf\u4e2a\u8bbe\u5907\u4e00\u7ec4\uff0c<code>;<\/code>\u00a0\u5206\u9694\u5bb9\u5668\u3002<\/p>\n<h3>2.8 Bind \u9636\u6bb5<\/h3>\n<p><code>Bind()<\/code>\uff08<code>scheduler.go:940<\/code>\uff09\u4e0d\u91cd\u65b0\u8ba1\u7b97\u5206\u914d\uff0c\u53ea\u505a\u4e24\u4ef6\u4e8b\uff1a<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-k1BcbbQT\">\n<li data-id=\"ld70c578-lBqDS68o\">\u52a0\u8282\u70b9\u9501\uff08\u901a\u8fc7 annotation\u00a0<code>hami.io\/mutex.lock<\/code>\u00a0\u5b9e\u73b0\u4e92\u65a5\uff0c\u9632\u6b62\u5e76\u53d1\u8c03\u5ea6\u51b2\u7a81\uff09<\/li>\n<li data-id=\"ld70c578-KbSOhMPa\">\u8c03\u7528 K8s API \u7ed1\u5b9a Pod \u5230 Node<\/li>\n<\/ol>\n<h2>3. DevicePlugin\uff1a\u6ce8\u5165\u9694\u79bb\u5c42<\/h2>\n<p><strong>\u300c\u5165\u53e3\u300d<\/strong>\uff1a<code>pkg\/device-plugin\/nvidiadevice\/nvinternal\/plugin\/server.go:737<\/code><code>Allocate()<\/code><\/p>\n<p>kubelet \u5728\u521b\u5efa\u5bb9\u5668\u524d\u8c03\u7528 DevicePlugin \u7684\u00a0<code>Allocate()<\/code>\uff0cHAMi \u7684\u8bbe\u5907\u63d2\u4ef6\u5728\u8fd9\u91cc\u5b8c\u6210\u5bb9\u5668\u5c42\u9762\u7684\u8d44\u6e90\u9694\u79bb\u3002<\/p>\n<h3>3.1 \u8bfb\u53d6\u8c03\u5ea6\u51b3\u7b56<\/h3>\n<p><code>decodePodSingleDevice()<\/code>\u00a0\u4ece Pod annotation \u89e3\u6790\u51fa\u8bbe\u5907\u5206\u914d\u4fe1\u606f\u3002<code>popNextContainerDevices()<\/code>\uff08<code>util.go:112<\/code>\uff09\u6309\u987a\u5e8f\u5f39\u51fa\u6bcf\u4e2a\u5bb9\u5668\u7684\u8bbe\u5907\u2014\u2014annotation \u4e2d init \u5bb9\u5668\u5728\u524d\uff0capp \u5bb9\u5668\u5728\u540e\u3002<\/p>\n<h3>3.2 \u6ce8\u5165\u73af\u5883\u53d8\u91cf<\/h3>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_7\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(line\r\n\/\/ server.go:822-837\r\nresponse.Envs[\"CUDA_DEVICE_MEMORY_LIMIT_0\"] = \"3000m\"  \/\/ \u663e\u5b58\u4e0a\u9650\r\nresponse.Envs[\"CUDA_DEVICE_SM_LIMIT\"] = \"50\"           \/\/ SM \u5229\u7528\u7387\u9650\u5236\r\nresponse.Envs[\"CUDA_DEVICE_MEMORY_SHARED_CACHE\"] = \"\/usr\/local\/vgpu\/xxx.cache\"<\/code><\/pre>\n<ul id=\"code_id_7\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1045.82px\">\n<colgroup data-id=\"c7104f7d-RJMdOXog\">\n<col span=\"1\" width=\"522.903\" data-id=\"cd89ecb0-s5XeetB0\" \/>\n<col span=\"1\" width=\"522.917\" data-id=\"cd89ecb0-TTgUNott\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-H3JFchRG\">\n<tr data-id=\"t31e458f-oQbobHmi\">\n<td data-id=\"t6267798-mIMvAwaY\" data-transient-attributes=\"table-cell-selection\">\u73af\u5883\u53d8\u91cf<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-BunbLhlp\" data-transient-attributes=\"table-cell-selection\">\u4f5c\u7528<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-KGOKCclU\">\n<td data-id=\"t6267798-sEzMs55r\" data-transient-attributes=\"table-cell-selection\"><code>CUDA_DEVICE_MEMORY_LIMIT_{i}<\/code><\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-d5RfTI5e\" data-transient-attributes=\"table-cell-selection\">\u7b2c i \u4e2a\u8bbe\u5907\u7684\u663e\u5b58\u4e0a\u9650\uff08MB\uff09<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-DHqm5SmS\">\n<td data-id=\"t27933fe-15eP5civ\" data-transient-attributes=\"table-cell-selection\"><code>CUDA_DEVICE_SM_LIMIT<\/code><\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-nUnPJ0mx\" data-transient-attributes=\"table-cell-selection\">SM \u5229\u7528\u7387\u9650\u5236\uff080-100\uff09<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-71e9vhJt\">\n<td data-id=\"t6267798-2J3lMxxg\" data-transient-attributes=\"table-cell-selection\"><code>CUDA_DEVICE_MEMORY_SHARED_CACHE<\/code><\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-ICmQB7ts\" data-transient-attributes=\"table-cell-selection\">\u5171\u4eab\u5185\u5b58\u7f13\u5b58\u6587\u4ef6\u8def\u5f84<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-ZEm1S05U\">\n<td data-id=\"t27933fe-UmThS2BC\" data-transient-attributes=\"table-cell-selection\"><code>CUDA_OVERSUBSCRIBE<\/code><\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-BDJYsNui\" data-transient-attributes=\"table-cell-selection\">\u8d85\u552e\u5f00\u5173\uff08<code>DeviceMemoryScaling &gt; 1<\/code>\u00a0\u65f6\u5f00\u542f\uff09<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-NAQpBcPQ\">\n<td class=\"table-last-column\" data-id=\"t6267798-KQ0nV71I\" data-transient-attributes=\"table-cell-selection\"><code>GPU_CORE_UTILIZATION_POLICY<\/code><\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t6267798-lxgyHir9\" data-transient-attributes=\"table-cell-selection\">\u7b97\u529b\u9650\u5236\u7b56\u7565\uff08default\/force\/disable\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>3.3 \u6302\u8f7d libvgpu.so<\/h3>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_8\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\n\/\/ server.go:845-873\r\n\/\/ \u6302\u8f7d libvgpu.so \u5230\u5bb9\u5668\r\nresponse.Mounts = append(response.Mounts, &amp;Mount{\r\n    ContainerPath: \"\/usr\/local\/vgpu\/libvgpu.so\",\r\n    HostPath:      hostHookPath + \"\/vgpu\/libvgpu.so\",\r\n    ReadOnly:      true,\r\n})\r\n\r\n\r\n\/\/ \u5173\u952e\uff1a\u901a\u8fc7 ld.so.preload \u52ab\u6301\u6240\u6709 CUDA \u8c03\u7528\r\nresponse.Mounts = append(response.Mounts, &amp;Mount{\r\n    ContainerPath: \"\/etc\/ld.so.preload\",\r\n    HostPath:      hostHookPath + \"\/vgpu\/ld.so.preload\",\r\n    ReadOnly:      true,\r\n})<\/code><\/pre>\n<ul id=\"code_id_8\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><code>ld.so.preload<\/code>\u00a0\u6587\u4ef6\u5185\u5bb9\u4e3a\u00a0<code>\/usr\/local\/vgpu\/libvgpu.so<\/code>\u3002Linux \u52a8\u6001\u94fe\u63a5\u5668\u5728\u52a0\u8f7d\u4efb\u4f55\u7a0b\u5e8f\u65f6\uff0c\u4f1a\u5148\u52a0\u8f7d\u00a0<code>ld.so.preload<\/code>\u00a0\u4e2d\u5217\u51fa\u7684\u5171\u4eab\u5e93\u3002\u8fd9\u6837\u00a0<code>libvgpu.so<\/code>\u00a0\u5c31\u88ab\u6ce8\u5165\u5230\u5bb9\u5668\u5185\u6240\u6709\u8fdb\u7a0b\u3002<\/p>\n<h3>3.4 \u8bbe\u5907\u526f\u672c\u673a\u5236<\/h3>\n<p>\u8bbe\u5907\u63d2\u4ef6\u5411 kubelet \u6ce8\u518c\u8bbe\u5907\u65f6\uff0c\u6bcf\u5f20\u7269\u7406 GPU \u88ab\u62a5\u544a\u4e3a\u00a0<code>DeviceSplitCount<\/code>\u00a0\u4e2a\u72ec\u7acb\u8bbe\u5907\uff08<code>rm\/devices.go:194<\/code><code>GetPluginDevices()<\/code>\uff09\u3002ID \u683c\u5f0f\u4e3a\u00a0<code>{\u539f\u59cbUUID}-{\u526f\u672c\u5e8f\u53f7}<\/code>\uff0c\u5982\u00a0<code>GPU-xxx-0<\/code>,\u00a0<code>GPU-xxx-1<\/code>\u3002kubelet \u5c06\u5b83\u4eec\u89c6\u4e3a\u72ec\u7acb\u8d44\u6e90\u8fdb\u884c\u5206\u914d\u3002<\/p>\n<h2>4. libvgpu.so\uff1a\u5bb9\u5668\u5185 CUDA API \u52ab\u6301<\/h2>\n<p><code>libvgpu.so<\/code>\u00a0\u7531 HAMi-core \u9879\u76ee\u7f16\u8bd1\uff0c\u662f\u8bbe\u5907\u5171\u4eab\u5728\u5bb9\u5668\u5c42\u9762\u7684\u6267\u884c\u8005\u3002<\/p>\n<h3>4.1 \u5de5\u4f5c\u539f\u7406<\/h3>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_9\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\n\u5bb9\u5668\u542f\u52a8\r\n  \u2192 ld.so \u8bfb\u53d6 \/etc\/ld.so.preload\r\n  \u2192 \u9884\u52a0\u8f7d libvgpu.so\r\n  \u2192 libvgpu.so \u8bfb\u53d6\u73af\u5883\u53d8\u91cf\u83b7\u53d6\u9650\u5236\u503c\r\n  \u2192 \u62e6\u622a\u6240\u6709 CUDA API \u8c03\u7528\uff1a\r\n      cudaMalloc \u2192 \u68c0\u67e5\u663e\u5b58\u662f\u5426\u8d85\u9650\r\n      kernel launch \u2192 \u68c0\u67e5 SM \u5229\u7528\u7387\u662f\u5426\u8d85\u9650\r\n  \u2192 \u591a\u5bb9\u5668\u901a\u8fc7\u5171\u4eab\u5185\u5b58\u533a\u57df\u534f\u8c03\u8d44\u6e90\u4f7f\u7528<\/code><\/pre>\n<ul id=\"code_id_9\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>4.2 \u5171\u4eab\u5185\u5b58\u534f\u8c03<\/h3>\n<p><code>pkg\/monitor\/nvidia\/v1\/spec.go:57<\/code>\u00a0\u5b9a\u4e49\u4e86\u5171\u4eab\u5185\u5b58\u533a\u57df\u683c\u5f0f\u00a0<code>sharedRegionT<\/code>\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_10\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\ntype sharedRegionT struct {\r\n    initializedFlag int32       \/\/ \u521d\u59cb\u5316\u6807\u5fd7\r\n    num             uint64      \/\/ \u8bbe\u5907\u6570\u91cf\r\n    uuids           [16]uuid    \/\/ \u8bbe\u5907 UUID \u5217\u8868\r\n    limit           [16]uint64  \/\/ \u6bcf\u4e2a\u8bbe\u5907\u7684\u663e\u5b58\u4e0a\u9650\r\n    smLimit         [16]uint64  \/\/ \u6bcf\u4e2a\u8bbe\u5907\u7684 SM \u4e0a\u9650\r\n    procs           [1024]shrregProcSlotT  \/\/ \u8fdb\u7a0b\u69fd\u4f4d\r\n    procnum         int32       \/\/ \u6d3b\u8dc3\u8fdb\u7a0b\u6570\r\n    \/\/ ...\r\n}<\/code><\/pre>\n<ul id=\"code_id_10\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u591a\u4e2a\u5bb9\u5668\u5171\u4eab\u540c\u4e00\u7269\u7406 GPU \u65f6\uff0c\u901a\u8fc7\u5171\u4eab\u5185\u5b58\u533a\u57df\u534f\u8c03\u5404\u81ea\u7684\u8d44\u6e90\u4f7f\u7528\u91cf\u3002<code>\/tmp\/vgpulock<\/code>\u00a0\u63d0\u4f9b\u8fdb\u7a0b\u95f4\u9501\uff0c\u786e\u4fdd\u5171\u4eab\u5185\u5b58\u64cd\u4f5c\u7684\u539f\u5b50\u6027\u3002<\/p>\n<h3>4.3 \u5b89\u5168\u8fb9\u754c<\/h3>\n<p><code>libvgpu.so<\/code>\u00a0\u7684\u62e6\u622a\u662f<strong>\u300c\u534f\u4f5c\u5f0f\u300d<\/strong>\u7684\uff0c\u4e0d\u662f\u5b89\u5168\u8fb9\u754c\u3002\u6709\u7279\u6743\u7684\u5bb9\u5668\u53ef\u4ee5\u901a\u8fc7\u53d6\u6d88\u00a0<code>LD_PRELOAD<\/code>\u00a0\u7ed5\u8fc7\u9650\u5236\u3002\u8fd9\u4e5f\u662f Webhook \u62d2\u7edd\u7279\u6743\u5bb9\u5668\u4f7f\u7528 GPU \u7684\u539f\u56e0\u3002\u5bf9\u4e8e\u4e0d\u53ef\u4fe1\u5de5\u4f5c\u8d1f\u8f7d\uff0c\u5e94\u4f7f\u7528 MIG \u786c\u4ef6\u9694\u79bb\u3002<\/p>\n<h2>\u4e09\u79cd\u5171\u4eab\u6a21\u5f0f\u5bf9\u6bd4<\/h2>\n<p>NVIDIA \u8bbe\u5907\u652f\u6301\u4e09\u79cd\u865a\u62df\u5316\u6a21\u5f0f\uff08<code>nvidia\/device.go:54<\/code>\uff09\uff1a<\/p>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1045.82px\">\n<colgroup data-id=\"c7104f7d-ZC53l901\">\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-7VbF9OXf\" \/>\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-j1W6BcYL\" \/>\n<col span=\"1\" width=\"261.444\" data-id=\"cd89ecb0-gAgE9wxx\" \/>\n<col span=\"1\" width=\"261.486\" data-id=\"cd89ecb0-DanLaOZg\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-Of67b0gO\">\n<tr data-id=\"t31e458f-rNHbZjAL\">\n<td data-id=\"t6267798-Caowv6Pi\" data-transient-attributes=\"table-cell-selection\">\u7ef4\u5ea6<\/td>\n<td data-id=\"t6267798-pRoEdEjg\" data-transient-attributes=\"table-cell-selection\">hami-core\uff08\u8f6f\u9694\u79bb\uff09<\/td>\n<td data-id=\"t6267798-7bcoeX9Q\" data-transient-attributes=\"table-cell-selection\">MIG\uff08\u786c\u4ef6\u9694\u79bb\uff09<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-XCRdOCC9\" data-transient-attributes=\"table-cell-selection\">MPS<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-R9Bjepxb\">\n<td data-id=\"t6267798-ICAS627c\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u9694\u79bb\u673a\u5236\u300d<\/strong><\/td>\n<td data-id=\"t6267798-CxDV3Sb8\" data-transient-attributes=\"table-cell-selection\">CUDA API \u52ab\u6301<\/td>\n<td data-id=\"t6267798-zs7YP7Bx\" data-transient-attributes=\"table-cell-selection\">GPU \u786c\u4ef6\u5206\u533a<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-YEHbzNYE\" data-transient-attributes=\"table-cell-selection\">NVIDIA MPS \u670d\u52a1<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-dGchAOF5\">\n<td data-id=\"t27933fe-TehZkdhQ\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u9694\u79bb\u5f3a\u5ea6\u300d<\/strong><\/td>\n<td data-id=\"t27933fe-9bLJMlbR\" data-transient-attributes=\"table-cell-selection\">\u5f31\uff08\u53ef\u7ed5\u8fc7\uff09<\/td>\n<td data-id=\"t27933fe-KmuKb4VS\" data-transient-attributes=\"table-cell-selection\">\u5f3a\uff08\u786c\u4ef6\u7ea7\uff09<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-VnM0uzxT\" data-transient-attributes=\"table-cell-selection\">\u4e2d<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-c3WHcjHR\">\n<td data-id=\"t6267798-Paep7qQ2\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u663e\u5b58\u9694\u79bb\u300d<\/strong><\/td>\n<td data-id=\"t6267798-1BaW0k98\" data-transient-attributes=\"table-cell-selection\">\u73af\u5883\u53d8\u91cf + libvgpu.so<\/td>\n<td data-id=\"t6267798-6UWOKFVJ\" data-transient-attributes=\"table-cell-selection\">\u786c\u4ef6\u72ec\u7acb\u663e\u5b58<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-YaivsUBp\" data-transient-attributes=\"table-cell-selection\">MPS \u5171\u4eab<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-oDUt0Je8\">\n<td data-id=\"t27933fe-RDJQgcvt\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u7b97\u529b\u9694\u79bb\u300d<\/strong><\/td>\n<td data-id=\"t27933fe-P0vJb8tT\" data-transient-attributes=\"table-cell-selection\">SM \u5229\u7528\u7387\u9650\u5236<\/td>\n<td data-id=\"t27933fe-wDrBkUbs\" data-transient-attributes=\"table-cell-selection\">\u786c\u4ef6\u72ec\u7acb SM<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-f5oyyAfu\" data-transient-attributes=\"table-cell-selection\">MPS \u8c03\u5ea6<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-O1DiS9nh\">\n<td data-id=\"t6267798-xUz5TpnQ\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u5207\u5206\u7c92\u5ea6\u300d<\/strong><\/td>\n<td data-id=\"t6267798-k5HHwEJK\" data-transient-attributes=\"table-cell-selection\">\u4efb\u610f\u663e\u5b58 + 0-100% \u7b97\u529b<\/td>\n<td data-id=\"t6267798-uoxKRCxR\" data-transient-attributes=\"table-cell-selection\">\u56fa\u5b9a profile\uff081g.5gb \u7b49\uff09<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-ki8VWKnP\" data-transient-attributes=\"table-cell-selection\">\u2014<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-flXVEmQb\">\n<td data-id=\"t27933fe-1QhnehzX\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u652f\u6301 GPU\u300d<\/strong><\/td>\n<td data-id=\"t27933fe-qFU1KWzT\" data-transient-attributes=\"table-cell-selection\">\u6240\u6709 NVIDIA GPU<\/td>\n<td data-id=\"t27933fe-WxfefD9T\" data-transient-attributes=\"table-cell-selection\">\u4ec5 A100\/H100 \u7b49<\/td>\n<td class=\"table-last-row\" data-id=\"t27933fe-A2U8T4fC\" data-transient-attributes=\"table-cell-selection\">\u652f\u6301 MPS \u7684 GPU<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-HGdDp6ur\">\n<td data-id=\"t6267798-keePzMZV\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u8d85\u552e\u300d<\/strong><\/td>\n<td data-id=\"t6267798-CbqmjMPC\" data-transient-attributes=\"table-cell-selection\">\u652f\u6301<\/td>\n<td data-id=\"t6267798-nPc0kuxe\" data-transient-attributes=\"table-cell-selection\">\u4e0d\u652f\u6301<\/td>\n<td class=\"table-last-row\" data-id=\"t6267798-bxfCjEL9\" data-transient-attributes=\"table-cell-selection\">\u2014<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-9X18jRb9\">\n<td class=\"table-last-column\" data-id=\"t27933fe-I4iegKmP\" data-transient-attributes=\"table-cell-selection\"><strong>\u300c\u6545\u969c\u9694\u79bb\u300d<\/strong><\/td>\n<td class=\"table-last-column\" data-id=\"t27933fe-h9NBDi2S\" data-transient-attributes=\"table-cell-selection\">\u65e0<\/td>\n<td class=\"table-last-column\" data-id=\"t27933fe-ZtELsjYe\" data-transient-attributes=\"table-cell-selection\">\u6709<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t27933fe-wJ9btQ9L\" data-transient-attributes=\"table-cell-selection\">\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>MIG \u5207\u5206\u7684\u5173\u952e\u903b\u8f91<\/h3>\n<p>MIG \u6a21\u5f0f\u4e0b\uff0c\u8c03\u5ea6\u5668\u4ece\u00a0<code>MigProfiles<\/code>\u00a0\u4e2d\u9009\u62e9\u5408\u9002\u7684 profile \u548c placement\uff08<code>nvidia\/device.go:598<\/code><code>selectMigCandidate()<\/code>\uff09\uff1a<\/p>\n<ul data-id=\"u738a58b-n138d4Ye\">\n<li data-id=\"ld70c578-wQow0S6n\">\u6309 MemoryMB \u5347\u5e8f\u6392\u5e8f\uff0c\u4f18\u5148\u9009\u6700\u5c0f\u7684\u80fd\u6ee1\u8db3\u9700\u6c42\u7684 profile<\/li>\n<li data-id=\"ld70c578-o8XpihxM\">\u68c0\u67e5 placement \u662f\u5426\u4e0e\u5df2\u5360\u7528\u7684\u4f4d\u7f6e\u51b2\u7a81\uff08<code>mig_topology.go:78<\/code><code>migPlacementsOverlap()<\/code>\uff09<\/li>\n<li data-id=\"ld70c578-qNUm9jiA\">\u5206\u914d\u540e\u4fee\u6b63\u00a0<code>Usedmem<\/code>\u00a0\u548c\u00a0<code>Usedcores<\/code>\u00a0\u4e3a profile \u5b9e\u9645\u503c\uff08\u4e0d\u662f\u8bf7\u6c42\u503c\uff09<\/li>\n<\/ul>\n<h2>init \u5bb9\u5668\u7684\u8d44\u6e90\u6298\u53e0<\/h2>\n<p>init \u5bb9\u5668\u548c app \u5bb9\u5668\u7684\u8d44\u6e90\u4f7f\u7528\u6a21\u5f0f\u4e0d\u540c\uff1ainit \u5bb9\u5668\u987a\u5e8f\u6267\u884c\uff0capp \u5bb9\u5668\u5e76\u884c\u6267\u884c\u3002HAMi \u5728\u8c03\u5ea6\u65f6\u53d6\u00a0<code>max(init \u5cf0\u503c, app \u603b\u548c)<\/code>\u00a0\u4f5c\u4e3a\u6709\u6548\u4f7f\u7528\u91cf\uff08<code>initContainer.go:35<\/code><code>CollapseInitContainerUsage()<\/code>\uff09\u3002<\/p>\n<p>\u5f53\u6240\u6709 init \u5bb9\u5668\u6210\u529f\u5b8c\u6210\u540e\uff0c\u8c03\u5ea6\u5668\u68c0\u6d4b\u5230\u00a0<code>AllInitContainersSucceeded<\/code>\uff08<code>scheduler.go:204<\/code>\uff09\uff0c\u5c06 Pod \u7684\u8bbe\u5907\u4f7f\u7528\u91cf\u4ece&#8221;\u6298\u53e0\u540e\u7684\u5cf0\u503c&#8221;\u6536\u7f29\u4e3a&#8221;\u4ec5 app \u5bb9\u5668\u7684\u4f7f\u7528\u91cf&#8221;\uff0c\u91ca\u653e\u591a\u4f59\u7684\u8d44\u6e90\u914d\u989d\u3002<\/p>\n<h2>\u914d\u989d\u7ba1\u7406<\/h2>\n<p><code>QuotaManager<\/code>\uff08<code>quota.go:27<\/code>\uff09\u7ef4\u62a4 namespace \u7ea7\u522b\u7684\u8bbe\u5907\u8d44\u6e90\u914d\u989d\uff1a<\/p>\n<ul data-id=\"u738a58b-beZaUocT\">\n<li data-id=\"ld70c578-hq4wRv6k\">\u76d1\u542c K8s\u00a0<code>ResourceQuota<\/code>\u00a0\u5bf9\u8c61\u53d8\u5316\uff0c\u8bfb\u53d6\u00a0<code>limits.<\/code>\u00a0\u524d\u7f00\u7684\u914d\u989d\u9879<\/li>\n<li data-id=\"ld70c578-0yH9aRKR\"><code>FitQuota()<\/code>\uff08<code>quota.go:62<\/code>\uff09\u68c0\u67e5\u00a0<code>Used + memreq &gt; Limit<\/code>\u00a0\u2192 \u62d2\u7edd<\/li>\n<li data-id=\"ld70c578-Unme7yRL\"><code>LimitSet<\/code>\u00a0\u5b57\u6bb5\u533a\u5206&#8221;\u663e\u5f0f\u9650\u5236\u4e3a 0&#8243;\u548c&#8221;\u672a\u8bbe\u7f6e\u9650\u5236&#8221;<\/li>\n<li data-id=\"ld70c578-y7jEIzX0\"><code>MemoryFactor<\/code>\u00a0\u5904\u7406\u4e0d\u540c\u5382\u5546\u7684\u663e\u5b58\u5355\u4f4d\u5dee\u5f02\uff08\u5982\u5bd2\u6b66\u7eaa MLU \u4ee5 256 MiB \u4e3a\u5355\u4f4d\uff09<\/li>\n<\/ul>\n<h2>\u5f02\u6784\u8bbe\u5907\u7edf\u4e00\u7ba1\u7406<\/h2>\n<p>\u6240\u6709\u5382\u5546\u8bbe\u5907\u5b9e\u73b0\u7edf\u4e00\u7684\u00a0<code>Devices<\/code>\u00a0\u63a5\u53e3\uff08<code>devices.go:34<\/code>\uff09\uff0c\u8c03\u5ea6\u5668\u4ee3\u7801\u5b8c\u5168\u7edf\u4e00\uff1a<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_11\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line\r\ntype Devices interface {\r\n    GenerateResourceRequests(ctr *corev1.Container) ContainerDeviceRequest\r\n    GetNodeDevices(n corev1.Node) ([]*DeviceInfo, error)\r\n    Fit(devices []*DeviceUsage, request ContainerDeviceRequest, ...) (bool, map[string]ContainerDevices, string)\r\n    AddResourceUsage(pod *corev1.Pod, n *DeviceUsage, ctr *ContainerDevice) error\r\n    PatchAnnotations(pod *corev1.Pod, annoinput *map[string]string, pd PodDevices) map[string]string\r\n    \/\/ ...\r\n}<\/code><\/pre>\n<ul id=\"code_id_11\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8c03\u5ea6\u65f6\u901a\u8fc7\u00a0<code>device.GetDevices()[k.Type]<\/code>\u00a0\u67e5\u627e\u5bf9\u5e94\u5382\u5546\u7684\u5b9e\u73b0\uff0c\u8c03\u7528\u00a0<code>Fit()<\/code>\u00a0\u8fdb\u884c\u5339\u914d\u3002\u5f53\u524d\u652f\u6301 15+ \u79cd\u8bbe\u5907\uff1aNVIDIA\u3001AMD\u3001\u5bd2\u6b66\u7eaa\u3001\u6607\u817e\u3001\u6d77\u5149 DCU\u3001\u71e7\u539f\u3001\u6469\u5c14\u7ebf\u7a0b\u3001MetaX\u3001\u6606\u4ed1\u3001\u58c1\u4ede\u3001\u5929\u6570\u667a\u82af\u3001AWS Neuron \u7b49\u3002<\/p>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>\u6587\u7ae0\u6765\u81ea\uff1a51CTO<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_30752\" class=\"pvc_stats total_only  \" data-element-id=\"30752\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewBox=\"0 0 502 315\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.ixpower.cn\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>HAMi \u8ba9\u591a\u4e2a Pod \u5171\u4eab\u540c\u4e00\u5f20\u7269\u7406 GPU\uff0c\u6309\u663e\u5b58\u548c\u7b97\u529b\u7cbe\u7ec6\u5206\u914d\u3002\u672c\u6587\u4ece\u6e90\u7801\u89d2\u5ea6\u62c6\u89e3\u8fd9\u6761\u94fe\u8def\uff1aPod \u63d0 [&hellip;]<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_30752\" class=\"pvc_stats total_only  \" data-element-id=\"30752\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewBox=\"0 0 502 315\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.ixpower.cn\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":56,"featured_media":30753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"publish_to_discourse":"0","publish_post_category":"5","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"","discourse_permalink":"","wpdc_publishing_response":"","wpdc_publishing_error":"","footnotes":""},"categories":[3,23,20,80],"tags":[2341],"class_list":["post-30752","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-23","category-20","category-80","tag-hamigpu"],"_links":{"self":[{"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/posts\/30752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/users\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/comments?post=30752"}],"version-history":[{"count":1,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/posts\/30752\/revisions"}],"predecessor-version":[{"id":30754,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/posts\/30752\/revisions\/30754"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/media\/30753"}],"wp:attachment":[{"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/media?parent=30752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/categories?post=30752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ixpower.cn\/index.php\/wp-json\/wp\/v2\/tags?post=30752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}