{"id":476407,"date":"2026-04-17T21:35:39","date_gmt":"2026-04-17T21:35:39","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=476407"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=476407","title":{"rendered":"\u041a\u0430\u043a \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b Qwen 3.5 \u043d\u0430 Mac: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a 8 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 LLM-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435?"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u043d\u043e: MacBook Pro 16&#8243; M2 Max, 64GB unified memory, \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0433\u043e\u043d\u044f\u0442\u044c Qwen 3.5 35B moe \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u043a inference-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f MLX &#8212; \u0448\u0442\u0443\u043a \u0432\u043e\u0441\u0435\u043c\u044c, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 README \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u00abblazing fast\u00bb. \u042f \u0432\u0437\u044f\u043b \u0432\u0441\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430 \u0432\u043e\u0441\u044c\u043c\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u043f\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f \u0443\u0434\u0438\u0432\u0438\u043b\u0438.<\/p>\n<p>\u0433\u0438\u0442 \u043c\u043e\u0435\u0433\u043e \u0431\u0435\u043d\u0447\u0430: <a href=\"https:\/\/github.com\/yaruslove\/qwen3.5-bench-8-mlx-server-mac\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/yaruslove\/qwen3.5-bench-8-mlx-server-mac<\/a><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/18\/8c\/0e\/188c0ef49814964c24fa8062871cb8c7.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/18\/8c\/0e\/188c0ef49814964c24fa8062871cb8c7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/18\/8c\/0e\/188c0ef49814964c24fa8062871cb8c7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0421\u0440\u0430\u0437\u0443 \u0441\u043d\u0438\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u00ab\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 llama.cpp?\u00bb<\/strong> llama.cpp \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u043d\u0430 Apple Silicon MLX \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 10-30%, \u0443\u043c\u0435\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 continuous batching \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u043e\u0434 unified memory &#8212; \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 GGUF. \u0421\u0442\u0430\u0442\u044c\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e MLX-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443: \u0442\u0430\u043c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 llama.cpp &#8212; \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0438 \u044f \u0435\u0451 \u043d\u0435 \u0438\u0437\u0431\u0435\u0433\u0430\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e.<\/p>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f 35B<\/strong> &#8212; \u0442\u0440\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:<\/p>\n<ul>\n<li>\n<p><strong>Privacy.<\/strong> \u0412 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0442 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u044b, \u0422\u0417, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u044d\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0432 ChatGPT \u0438\u043b\u0438 Claude. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u0435\u043a: \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0424\u0418\u041e, \u0441\u0447\u0435\u0442\u0430, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>Coding-\u0430\u0433\u0435\u043d\u0442\u044b \u0438 open-code.<\/strong> Claude \u0438 GPT \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0445\u043e\u0440\u043e\u0448\u0438, \u043f\u043e\u043a\u0430 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0433\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u0432\u043e\u0441\u0435\u043c\u044c \u0447\u0430\u0441\u043e\u0432 &#8212; \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0444\u0435\u0439\u043d\u044b\u0435 \u0437\u0451\u0440\u043d\u0430. \u0412\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 open-source \u0442\u0443\u043b\u044b \u0434\u043b\u044f AI-\u043a\u043e\u0434\u0438\u043d\u0433\u0430 &#8212; <strong>OpenCode, Aider, Claude Code<\/strong> &#8212; \u0443\u043c\u0435\u044e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c\u0443 endpoint. \u0421\u0442\u0430\u0432\u0438\u0448\u044c <code>base_url: http:\/\/mac.local:8000\/v1<\/code> \u0438 \u0441\u0432\u043e\u0439 API-\u043a\u043b\u044e\u0447 &#8212; \u0430\u0433\u0435\u043d\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0443\u0436\u0435 \u043e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0431\u0435\u0437 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 rate-limit\u2019\u043e\u0432. \u041d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u043c\u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u043d\u044f\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 LLM: \u0441 \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0431\u044b\u043b GLM 4.7 Flash \u043d\u0430 4090, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044f\u044e Qwen 3.5 35B \u043d\u0430 Mac.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e RTT.<\/strong> 35B \u0432 4-\u0431\u0438\u0442 \u043d\u0430 M2 Max \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0436\u0438\u0432\u0435\u0435 \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 API \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0440\u0430\u0443\u043d\u0434-\u0442\u0440\u0438\u043f\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b &#8212; \u044d\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u0433\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e: \u0442\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438\u0434\u0443\u0442 \u043d\u043e\u0437\u0434\u0440\u044f \u0432 \u043d\u043e\u0437\u0434\u0440\u044e \u043d\u0430 single-user, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 &#8212; \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u043e \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0434\u0438\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0432 <strong>2.17\u00d7 speedup<\/strong>, \u0430 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 <strong>0.85\u00d7<\/strong>, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u0430\u0448\u044c \u0435\u043c\u0443 <code>--workers 2<\/code>. \u041f\u043e \u0445\u043e\u0434\u0443 \u0432\u0441\u043f\u043b\u044b\u043b\u0438 <strong>\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 attention \u0432 2026 \u0433\u043e\u0434\u0443<\/strong>, <strong>\u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435 14000 tokens\/sec<\/strong> \u0438\u0437-\u0437\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 SSE-\u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0438 <strong>\u0437\u043e\u043c\u0431\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 20GB RAM<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c README.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5b\/96\/fe\/5b96fe89b1833c1f17c8c9345551c846.png\" alt=\"\u0422\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 2% - \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e single user\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/5b\/96\/fe\/5b96fe89b1833c1f17c8c9345551c846.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/5b\/96\/fe\/5b96fe89b1833c1f17c8c9345551c846.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 2% &#8212; \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e single user<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e single-user. \u0421 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f &#8212; \u043d\u043e \u0434\u043e \u043d\u0435\u0451 \u0434\u043e\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<hr\/>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e<\/h3>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. Mac &#8212; \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 LLM-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0432\u0435\u0440\u0445\u0443 LiteLLM-\u0433\u0435\u0439\u0442\u0432\u0435\u0439, \u0434\u0430\u043b\u044c\u0448\u0435 VPS \u0441 \u0431\u0435\u043b\u044b\u043c IP &#8212; \u0447\u0442\u043e\u0431\u044b \u0434\u0451\u0440\u0433\u0430\u0442\u044c Qwen \u043f\u043e API \u043a\u0430\u043a Open-AI compatiable \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435: OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 endpoint (<code>\/v1\/chat\/completions<\/code>), \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b &#8212; <code>mlx-vlm<\/code>. \u042d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f vision-\u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u043e \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b <strong>15\u201325 tps<\/strong>, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0430\u0434\u0430\u0435\u0442, LiteLLM \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u0442, \u043d\u043e \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u042f\u0441\u043d\u043e \u0441\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e: \u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 <code>mlx-vlm<\/code> &#8212; MLX-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u0440\u043e \u0432\u044b\u0431\u043e\u0440 MLX \u0432\u043c\u0435\u0441\u0442\u043e llama.cpp \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0441\u044c; \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0438\u0432\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a &#8212; \u043d\u0430\u0448\u0451\u043b <a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1rezq19\/qwen3535b_on_apple_silicon_how_i_got_2x_faster\/\" rel=\"noopener noreferrer nofollow\">Reddit \u0442\u0440\u0435\u0434 \u043d\u0430 r\/LocalLLaMA<\/a>, \u0433\u0434\u0435 \u043d\u0430\u0440\u043e\u0434 \u043c\u0435\u0440\u044f\u0435\u0442 2\u00d7 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043d\u0430 Qwen 3.5 35B. \u0412\u0430\u0436\u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u043e\u0435: MLX-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e. \u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u044f \u0443\u0437\u043d\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0430\u043b \u043a\u043e\u043f\u0430\u0442\u044c.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0433\u0430\u0434\u0430\u0442\u044c \u043f\u043e README, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0438\u0441\u0430\u043b \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u0430\u043a subprocess, \u0436\u0434\u0451\u0442 healthcheck \u043d\u0430 <code>\/v1\/models<\/code>, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u0432\u043e\u0441\u0435\u043c\u044c \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u0432 single-\u0440\u0435\u0436\u0438\u043c\u0435, \u043f\u043e\u0442\u043e\u043c \u0442\u0435 \u0436\u0435 \u043f\u0430\u0440\u044b \u0432 \u0434\u0432\u043e\u0439\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 asyncio-\u0431\u0430\u0440\u044c\u0435\u0440, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 CSV \u0438 \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u0418 \u0442\u0430\u043a \u0448\u0435\u0441\u0442\u044c \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434, \u043f\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h4>\u041a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u043c\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0438\u0442\u044c: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 MLX, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441 NVIDIA<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0444\u043e\u043d\u043e\u043c \u0443 \u0432\u0430\u0441 CUDA \u0438 PyTorch &#8212; \u0432\u043e\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043c\u0438\u0440\u0430 Apple Silicon:<\/p>\n<ul>\n<li>\n<p><strong>Metal<\/strong> &#8212; \u044d\u0442\u043e Apple-\u0441\u043a\u0438\u0439 CUDA. GPU-API \u0447\u0438\u043f\u0430 M-series, \u043d\u0430 \u043d\u0451\u043c \u0438\u0434\u0443\u0442 \u0432\u0441\u0435 matmul \u0438 attention. \u0410\u043d\u0430\u043b\u043e\u0433 CUDA Toolkit.<\/p>\n<\/li>\n<li>\n<p><strong>MLX<\/strong> &#8212; \u044d\u0442\u043e Apple-\u0441\u043a\u0438\u0439 PyTorch + CUDA runtime \u0432 \u043e\u0434\u043d\u043e\u043c \u043b\u0438\u0446\u0435. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Apple \u0434\u043b\u044f ML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 Metal. \u0412\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430: <code>mlx-lm<\/code> \u0434\u043b\u044f LLM (\u0430\u043d\u0430\u043b\u043e\u0433 HuggingFace Transformers), <code>mlx.fast<\/code> &#8212; \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f flash attention (\u0430\u043d\u0430\u043b\u043e\u0433 cuDNN).<\/p>\n<\/li>\n<li>\n<p><strong>Unified memory<\/strong> &#8212; \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 NVIDIA. \u041d\u0430 RTX \u0443 \u0432\u0430\u0441 24GB VRAM \u0438 64GB RAM <strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/strong>, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432 \u0438\u0437 RAM \u0432 VRAM &#8212; \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u0447\u0435\u0440\u0435\u0437 <code>cudaMemcpy<\/code>. \u041d\u0430 M-series CPU \u0438 GPU \u0434\u0435\u043b\u044f\u0442 \u043e\u0434\u0438\u043d \u043f\u0443\u043b \u043f\u0430\u043c\u044f\u0442\u0438. 35B-\u043c\u043e\u0434\u0435\u043b\u044c \u0432 20GB \u043b\u0435\u0436\u0438\u0442 <strong>\u043e\u0434\u0438\u043d \u0440\u0430\u0437<\/strong> \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0431\u043e\u0438\u043c &#8212; \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043f\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 GPU \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 CPU \u043d\u0430 LLM? \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u043e\u043d \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u043b\u043e\u0451\u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0445 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0439. \u0423 CPU \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0434\u0435\u0440 \u0441 \u043a\u0435\u0448\u0435\u043c, \u0443 GPU &#8212; \u0442\u044b\u0441\u044f\u0447\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u044f\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0440\u0443\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041e\u0434\u043d\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 CPU \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435; \u0431\u0430\u0442\u0447 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 &#8212; GPU \u0431\u044c\u0451\u0442 CPU \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437. <strong>M2 Max \u0434\u0430\u0451\u0442 ~400 GB\/s memory bandwidth<\/strong> &#8212; \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u0442\u0430\u0439\u043c-\u0434\u0435\u043a\u043e\u0434 35B \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <strong>50-80 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<\/strong>. \u041d\u0430 CPU \u0442\u043e\u0439 \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b \u0431\u044b \u0436\u0434\u0430\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 <strong>\u0432 10-20 \u0440\u0430\u0437 \u0434\u043e\u043b\u044c\u0448\u0435<\/strong>.<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u044e\u0430\u043d\u0441: Metal \u043d\u0435 \u0448\u0430\u0440\u0438\u0442 GPU-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0448\u0435\u0441\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b <strong>\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443<\/strong> &#8212; \u0434\u0432\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0436\u0435\u043b\u0435\u0437\u043a\u0435.<\/p>\n<p>\u041d\u0438\u0436\u0435 &#8212; \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e.<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c: \u0432\u043e\u0441\u0435\u043c\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432<\/h3>\n<p>\u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0428\u0435\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0434\u0432\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b &#8212; \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043d\u0438\u0436\u0435.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u042f\u0437\u044b\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0438\u0447\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/cubist38\/mlx-openai-server\" rel=\"noopener noreferrer nofollow\"><strong>mlx-openai-server<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.11<\/p>\n<\/td>\n<td>\n<p align=\"left\">Queue-batcher, image gen (Flux), multi-model<\/p>\n<\/td>\n<td>\n<p align=\"left\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/madroidmaq\/mlx-omni-server\" rel=\"noopener noreferrer nofollow\"><strong>mlx-omni-server<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.11+<\/p>\n<\/td>\n<td>\n<p align=\"left\">Dual API &#8212; OpenAI + Anthropic \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/raullenchai\/Rapid-MLX\" rel=\"noopener noreferrer nofollow\"><strong>Rapid-MLX<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.10+<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430, 1900+ \u0442\u0435\u0441\u0442\u043e\u0432, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 (Cursor, Aider)<\/p>\n<\/td>\n<td>\n<p align=\"left\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/waybarrios\/vllm-mlx\" rel=\"noopener noreferrer nofollow\"><strong>vllm-mlx<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.10+<\/p>\n<\/td>\n<td>\n<p align=\"left\">vLLM-style, paged KV cache, multimodal<\/p>\n<\/td>\n<td>\n<p align=\"left\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/jundot\/omlx\" rel=\"noopener noreferrer nofollow\"><strong>omlx<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tiered KV cache (RAM + SSD), admin dashboard<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/Blaizzy\/mlx-vlm\" rel=\"noopener noreferrer nofollow\"><strong>mlx-vlm<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Python 3.10+<\/p>\n<\/td>\n<td>\n<p align=\"left\">Fine-tuning VLM, 40+ \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/panbanda\/higgs\" rel=\"noopener noreferrer nofollow\"><strong>higgs<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Rust<\/p>\n<\/td>\n<td>\n<p align=\"left\">Single binary, \u0431\u0435\u0437 Python<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/ddalcu\/mlx-serve\" rel=\"noopener noreferrer nofollow\"><strong>mlx-serve<\/strong><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">Zig<\/p>\n<\/td>\n<td>\n<p align=\"left\">Native, agent mode, \u0431\u0435\u0437 Python<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442 &#8212; \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0442\u043e \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0431\u0435\u0437 \u0432\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 README:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/20\/0e\/ef\/200eef541dfb204594974e18ca68e4ed.png\" alt=\"\u041b\u0430\u043d\u0434\u0448\u0430\u0444\u0442: 8 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u00d7 6 \u0444\u0438\u0447\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/20\/0e\/ef\/200eef541dfb204594974e18ca68e4ed.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/20\/0e\/ef\/200eef541dfb204594974e18ca68e4ed.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041b\u0430\u043d\u0434\u0448\u0430\u0444\u0442: 8 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u00d7 6 \u0444\u0438\u0447<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u0440\u043e\u0442\u043a\u043e.<\/p>\n<p><strong>mlx-openai-server<\/strong> &#8212; drop-in \u0437\u0430\u043c\u0435\u043d\u0430 OpenAI API. \u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c continuous batching (<strong>\u0441\u0440\u0430\u0437\u0443 \u0441\u043f\u043e\u0439\u043b\u0435\u0440 &#8212; \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442<\/strong>), speculative decoding \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f, multi-model \u0447\u0435\u0440\u0435\u0437 YAML, structured output \u0447\u0435\u0440\u0435\u0437 outlines. \u041c\u0438\u043d\u0443\u0441 &#8212; \u0436\u0451\u0441\u0442\u043a\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Python 3.11 \u0438 \u0442\u0430\u0449\u0438\u0442 torchvision + ffmpeg \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445.<\/p>\n<p><strong>mlx-omni-server<\/strong> &#8212; \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441 \u0434\u0432\u043e\u0439\u043d\u044b\u043c API: <code>\/v1\/*<\/code> \u0432 \u0441\u0442\u0438\u043b\u0435 OpenAI <strong>\u0438<\/strong> <code>\/anthropic\/v1\/*<\/code> \u0434\u043b\u044f Claude-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041f\u043b\u044e\u0441 TTS\/STT \u0438 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438. \u041d\u044e\u0430\u043d\u0441 \u0441 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c &#8212; \u043d\u0438\u0436\u0435 \u0446\u0435\u043b\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p><strong>Rapid-MLX<\/strong> &#8212; \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u00ab\u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00bb: <code>rapid-mlx serve &lt;model&gt;<\/code>. 1900+ \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u0435, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Cursor, Claude Code, Aider, Open WebUI, LibreChat. \u041c\u0438\u043d\u0443\u0441 &#8212; \u043d\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u0447\u0430\u043d\u043a\u0438 \u0442\u043e\u043a\u0435\u043d-\u0437\u0430-\u0442\u043e\u043a\u0435\u043d\u043e\u043c, \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0435\u0441\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0434\u043d\u0438\u043c \u043a\u0443\u0441\u043a\u043e\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e <code>gen_tps<\/code> \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0435 \u043c\u0435\u0440\u0438\u0442 (\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 0), \u0430 TTFT \u0443 \u043d\u0435\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p><strong>vllm-mlx<\/strong> &#8212; vLLM-style inference, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 Apple Silicon. Paged KV cache \u0441 prefix sharing, \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c (text + image + video + audio), Anthropic Messages API. \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 &#8212; \u0442\u0430\u0449\u0438\u0442 torch \u043d\u0430 2.5GB \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0435\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0430\u0433 \u0432 SSE streaming, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435 <strong>14000 tokens\/sec<\/strong>. \u041f\u0440\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p><strong>omlx<\/strong> &#8212; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: tiered KV cache, \u0433\u0434\u0435 \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432 RAM, \u0445\u043e\u043b\u043e\u0434\u043d\u0430\u044f &#8212; \u043d\u0430 SSD \u0432 safetensors. Multi-model \u0441 LRU-\u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c, \u0432\u0435\u0431-\u0434\u0430\u0448\u0431\u043e\u0440\u0434, tool calling + MCP. Requires macOS 15 (Sequoia). \u041a\u0440\u0438\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; hardcoded ctx window <strong>32768 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/strong>. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u043c\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 HTTP 400.<\/p>\n<p><strong>mlx-vlm<\/strong> &#8212; \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f Vision Language Models (\u0432\u043a\u043b\u044e\u0447\u0430\u044f fine-tuning), \u0430 \u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 40+ \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440. \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u0438 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0442\u0430\u0445 (30k+ \u0442\u043e\u043a\u0435\u043d\u043e\u0432) \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 pathological prefill slowdown &#8212; \u044f \u0432\u0438\u0434\u0435\u043b 31 \u043c\u0438\u043d\u0443\u0442\u0443 \u043d\u0430 prefill 52k \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u0440\u0438\u0447\u0451\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0430\u0447\u0435\u0442 790 \u2192 3.5 \u2192 790 \u2192 3.5 tok\/s, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e GC \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p><strong>higgs (Rust) &#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d.<\/strong> \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0440\u043e\u0432\u0430\u043b \u043d\u043e \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 Rust-\u0441\u0435\u0440\u0432\u0435\u0440: single binary, zero Python runtime, TUI-\u0434\u0430\u0448\u0431\u043e\u0440\u0434, structured output \u043d\u0430 json_schema \u0441 100% compliance. \u0412 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u0444\u0440\u0430\u0445 &#8212; 755 tok\/s \u043d\u0430 8 concurrent. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0438\u0434\u043d\u0430\u044f: \u0432 registry \u0435\u0441\u0442\u044c <code>qwen3<\/code>, <code>qwen3_moe<\/code> \u0438 <code>qwen3_next<\/code> &#8212; \u043d\u043e <strong>\u043d\u0435\u0442 <\/strong><code><strong>qwen3_5_moe<\/strong><\/code>. \u041d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 &#8212; \u0432\u0435\u0440\u043d\u0451\u043c \u0432 \u0431\u043e\u0439.<\/p>\n<p><strong>mlx-serve (Zig) &#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d.<\/strong> \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 Zig, zero Python, MLX Core macOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 agent mode \u0438 \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a, \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<hr\/>\n<h3>\u041a\u0430\u043a \u044f \u043c\u0435\u0440\u0438\u043b: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a-\u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430 Python<\/h3>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 &#8212;  <a href=\"https:\/\/huggingface.co\/mlx-community\/Qwen3.5-35B-A3B-4bit\" rel=\"noopener noreferrer nofollow\">mlx-community\/Qwen3.5-35B-A3B-4bit<\/a>. MoE \u0441 3B \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 35B, 4-bit \u043a\u0432\u0430\u043d\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0432 RAM \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~20GB. \u0412\u044b\u0431\u043e\u0440 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439: \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 64GB \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c \u043f\u043e\u0434 KV cache, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 MLX-\u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0448\u0435\u0441\u0442\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0416\u0435\u043b\u0435\u0437\u043e &#8212; Apple Mac M-series, 64GB unified memory. \u0412\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u0435\u043b\u044f\u0442 \u043e\u0434\u043d\u0443 GPU (Metal), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438: \u043e\u0434\u0438\u043d \u0437\u0430 \u0440\u0430\u0437.<\/p>\n<p>\u0425\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>app_inference<\/code>, \u044d\u0442\u043e ~700 \u0441\u0442\u0440\u043e\u043a Python \u043d\u0430 httpx, pyyaml, rich, psutil. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f:<\/p>\n<pre><code>YAML config \u2192 Runner \u2192 Launcher \u2192 Healthcheck \u2192 Scenarios \u2192 Metrics \u2192 Summary \u2192 Analyze<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>Launcher<\/strong> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 subprocess \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 stdout \u0432 <code>server.log<\/code>, \u0436\u0434\u0451\u0442 <code>\/v1\/models<\/code> (healthcheck \u043a\u0430\u0436\u0434\u044b\u0435 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0442\u0430\u0439\u043c\u0430\u0443\u0442 600\u0441), \u043f\u043e\u0442\u043e\u043c \u0433\u0430\u0441\u0438\u0442 SIGTERM \u2192 15\u0441 \u2192 SIGKILL.<\/p>\n<p><strong>Client<\/strong> \u0434\u0435\u043b\u0430\u0435\u0442 POST <code>\/v1\/chat\/completions<\/code> \u0441 <code>stream: true<\/code>, \u043f\u0430\u0440\u0441\u0438\u0442 SSE \u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0440\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430: \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 (<code>t_start<\/code>), \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u0451\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d (<code>t_first<\/code> &#8212; \u043e\u0442\u0441\u044e\u0434\u0430 TTFT), \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f (<code>t_end<\/code>).<\/p>\n<p><strong>Scenarios<\/strong> \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442 \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430. <code>run_single<\/code> &#8212; \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, 8 \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c. <code>run_double_batch<\/code> &#8212; \u0434\u0432\u0430 \u043f\u0440\u043e\u043c\u0442\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 asyncio-\u043b\u043e\u0430\u0434\u0435\u0440:<\/p>\n<pre><code class=\"python\">gate = asyncio.Event()task_a = create_task(chat_stream(..., start_gate=gate))task_b = create_task(chat_stream(..., start_gate=gate))await asyncio.sleep(0.05)   # \u043e\u0431\u0430 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430gate.set()                   # \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043eres_a, res_b = await gather(task_a, task_b)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 wall-clock \u043c\u0435\u0442\u0440\u0438\u043a, \u0432 CSV \u043b\u0435\u0442\u044f\u0442 <code>request_start_offset<\/code> (\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u0440\u0442\u044b) \u0438 <code>overlap_ratio<\/code> (\u0434\u043e\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u044b\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b). \u0420\u0435\u0447\u044c \u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0435, \u0430 \u043d\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0431\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u043d\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p><strong>\u0427\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e:<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>wall_tps_p50<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432\/\u0441 \u043f\u043e wall-clock<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0430\u043c\u0430\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u0430\u044f<\/strong>, \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>gen_tps_p50<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Decode speed (\u0442\u043e\u043a\u0435\u043d\u044b \/ (t_end \u2212 t_first))<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0443\u0441\u043e\u0440 \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u0442\u043e\u043a\u0435\u043d-\u0437\u0430-\u0442\u043e\u043a\u0435\u043d\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ttft_p50<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Time to first token<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>speedup<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Batching-\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0434\u0451\u0436\u043d\u0430 &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 wall_tps<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0435\u0437\u0434\u0435 \u043c\u0435\u0434\u0438\u0430\u043d\u0430, \u0430 \u043d\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0435? \u0412\u043e\u0441\u0435\u043c\u044c \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u043e\u0442 100 \u0434\u043e 53000 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 &#8212; \u044d\u0442\u043e \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u0440\u043e\u0441. \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0434\u0430\u0441\u0442 \u043f\u0435\u0440\u0435\u0432\u0435\u0441 \u0434\u043b\u0438\u043d\u043d\u044b\u043c: \u043e\u0434\u0438\u043d 40k-\u043f\u0440\u043e\u043c\u0442 \u0441 110 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438 total-time \u0443\u0442\u043e\u043f\u0438\u0442 \u0432\u043e\u0441\u0435\u043c\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0432 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435. \u041c\u0435\u0434\u0438\u0430\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0418 \u0435\u0449\u0451 &#8212; \u043f\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435 \u043e\u0434\u043d\u0430. Iter01 \u0431\u044b\u043b baseline. Iter02 \u0434\u043e\u0431\u0430\u0432\u0438\u043b <code>max_tokens=2048<\/code> \u0432\u043c\u0435\u0441\u0442\u043e 1024 \u0438 \u044f\u0432\u043d\u044b\u0439 <code>model_alias<\/code> \u0434\u043b\u044f mlx-omni (\u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441 \u043f\u043e\u0434\u043c\u0435\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 &#8212; \u043d\u0438\u0436\u0435). Iter03 \u0438 iter04 &#8212; \u043f\u043e\u0432\u0442\u043e\u0440\u044b iter02 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. Iter05 &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 <code>--workers 2<\/code> \u043a mlx-omni \u0434\u043b\u044f \u0444\u0438\u043a\u0441\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u043d\u0430 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u0435.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a &#8212; \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"bash\">cd app_inferenceuv run -m app_inference run --config config\/iteration_05.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 <code>data_test\/results\/NNN_iterXX_YYYYMMDD_HHMMSS\/<\/code> &#8212; \u043f\u043e\u043b\u043d\u044b\u0439 CSV, \u043b\u043e\u0433\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043e\u0442\u0432\u0435\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 <code>.md<\/code>, \u043a\u043e\u043f\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0441\u043d\u0438\u043c\u043e\u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<hr\/>\n<h3>\u0412\u043e\u0441\u0435\u043c\u044c \u043f\u0440\u043e\u043c\u0442\u043e\u0432: \u043e\u0442 AIME \u0434\u043e 52k \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/h3>\n<p>\u041f\u0440\u043e\u043c\u0442\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 &#8212; \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0434\u043e \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0445. \u0412\u043e\u0442 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0430\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/c1\/a6\/0d\/c1a60d48e3eea957ef3adbb5fa3ebeda.png\" alt=\"\u041b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438: \u043e\u0442 176 \u0434\u043e 52 247 \u0442\u043e\u043a\u0435\u043d\u043e\u0432\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/c1\/a6\/0d\/c1a60d48e3eea957ef3adbb5fa3ebeda.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/c1\/a6\/0d\/c1a60d48e3eea957ef3adbb5fa3ebeda.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438: \u043e\u0442 176 \u0434\u043e 52 247 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0438 \u0442\u043e\u0436\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">#<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u043c\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u043e\u043a\u0435\u043d\u044b<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>100_aime.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">176<\/p>\n<\/td>\n<td>\n<p align=\"left\">AIME, 1 \u0437\u0430\u0434\u0430\u0447\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c, Chain-of-Thought<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>500_gpqa.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">562<\/p>\n<\/td>\n<td>\n<p align=\"left\">GPQA PhD, 4 MCQ<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0443\u0447\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>2000_mmlu-pro.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">3 449<\/p>\n<\/td>\n<td>\n<p align=\"left\">MMLU-Pro, 34 MCQ<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0428\u0438\u0440\u043e\u0442\u0430 \u0437\u043d\u0430\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>5000_swe-bench.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">5 434<\/p>\n<\/td>\n<td>\n<p align=\"left\">SWE-Bench, 48 issues<\/p>\n<\/td>\n<td>\n<p align=\"left\">Code analysis<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>long_story_15000.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">1 065<\/p>\n<\/td>\n<td>\n<p align=\"left\">creative<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>15000_gpqa.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">19 315<\/p>\n<\/td>\n<td>\n<p align=\"left\">GPQA extended, 189 MCQ<\/p>\n<\/td>\n<td>\n<p align=\"left\">Lost in the middle<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>40000_swe-bench.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">43 649<\/p>\n<\/td>\n<td>\n<p align=\"left\">SWE-Bench extended<\/p>\n<\/td>\n<td>\n<p align=\"left\">Edge-case stress<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>30000_mmlu-pro.md<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">52 247<\/p>\n<\/td>\n<td>\n<p align=\"left\">MMLU-Pro extended, 521 MCQ<\/p>\n<\/td>\n<td>\n<p align=\"left\">Long context, \u043f\u0440\u0435\u0434\u0435\u043b<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u0442\u044b \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e: Qwen 3.5 \u0445\u043e\u0440\u043e\u0448\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0438 \u044d\u0442\u043e \u043c\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 use case. \u0422\u043e\u043b\u044c\u043a\u043e <code>long_story_15000.md<\/code> \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c &#8212; \u0444\u044d\u043d\u0442\u0435\u0437\u0438-\u043d\u043e\u0432\u0435\u043b\u043b\u0430 \u043f\u0440\u043e \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0430 Maren Vale \u0432 \u0441\u0435\u0442\u0442\u0438\u043d\u0433\u0435 Hollow Tides, 10 \u0433\u043b\u0430\u0432, 10-14k \u0441\u043b\u043e\u0432 &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 retrieval.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0442\u0430 \u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b gold-\u043e\u0442\u0432\u0435\u0442 \u0442\u043e\u0439 \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043d\u0430 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u0435 &#8212; \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b 200 OK\u00bb, \u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e \u0441\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u042d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u0430\u0436\u043d\u044b\u043c \u043f\u043e\u0437\u0436\u0435, \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0439: \u0434\u043b\u0438\u043d\u0430 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 &#8212; \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0414\u043b\u044f double_batch \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0430\u0440\u044b: \u00ab\u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 + \u0434\u043b\u0438\u043d\u043d\u044b\u0439\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>500_gpqa<\/code> (562 tok) \u0432 \u043f\u0430\u0440\u0443 \u0441 <code>15000_gpqa<\/code> (19315 tok). \u042d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u044f\u043d\u0435\u0442 \u0440\u0443\u0447\u043a\u0443 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c prefill, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0436\u0434\u0451\u0442 \u0441\u0432\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<hr\/>\n<h3>Single user: \u043a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 &#8212; <code>wall_tps_p50<\/code> \u0438\u0437 \u043b\u0443\u0447\u0448\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u0422\u0440\u0438 \u043b\u0438\u0434\u0435\u0440\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 2% &#8212; \u044d\u0442\u043e \u0448\u0443\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u043c\u0438, \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u043c\u0430:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ab\/c0\/1d\/abc01da03a5b227458741a8a9d9fa7e8.png\" alt=\"Single user: \u043a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/ab\/c0\/1d\/abc01da03a5b227458741a8a9d9fa7e8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/ab\/c0\/1d\/abc01da03a5b227458741a8a9d9fa7e8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Single user: \u043a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u043b\u0438\u0434\u0435\u0440\u0430\u043c \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435: <strong>mlx-omni-server (64 tps)<\/strong> \u0438 <strong>mlx-openai-server (63 tps)<\/strong> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 <code>gen_tps<\/code> \u043e\u043a\u043e\u043b\u043e <strong>75 tokens\/sec<\/strong> &#8212; \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f decode-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0430 Apple Silicon \u0434\u043b\u044f 4-\u0431\u0438\u0442\u043d\u043e\u0439 35B MoE. <strong>Rapid-MLX<\/strong> \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u0433\u0440\u0443\u043f\u043f\u0435 \u043f\u043e wall_tps (62.9), \u043d\u043e \u043e\u043d \u043d\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 &#8212; \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0434\u043d\u0438\u043c \u043a\u0443\u0441\u043a\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e TTFT = 36\u0441 (\u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u043d\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430). \u0414\u043b\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043a\u0435\u0439, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e UI &#8212; \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041d\u0438\u0436\u0435 &#8212; \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430: <strong>vllm-mlx (56 tps)<\/strong> \u0438 <strong>omlx (51 tps)<\/strong> \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u044e\u0442, \u0445\u043e\u0442\u044f \u0434\u0435\u043a\u043e\u0434\u044f\u0442 \u0442\u0435\u043c \u0436\u0435 mlx-lm \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u041f\u0440\u043e vllm-mlx \u0432\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0432 <code>gen_tps = 14909<\/code> &#8212; \u044d\u0442\u043e \u043d\u0435 decode-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u044d\u0442\u043e \u0431\u0430\u0433 (\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435). \u0423 omlx &#8212; \u0434\u0432\u0430 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u0443\u043f\u0430\u043b\u0438 \u0441 HTTP 400 \u0438\u0437-\u0437\u0430 \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0448\u0438\u0442\u043e\u0433\u043e ctx window 32k. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0435\u0441\u0442\u044c \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c prefill.<\/p>\n<p><strong>mlx-vlm (36 tps)<\/strong> &#8212; \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0432\u0441\u0435\u0445, \u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d. \u042d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 VLM \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c, \u043d\u0435 production-\u0441\u0435\u0440\u0432\u0435\u0440 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u0435\u043d 40+ \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 VLM \u0438\u043b\u0438 fine-tuning, \u043d\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d-\u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0430.<\/p>\n<h4>\u041a\u0430\u043a \u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u043f\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c<\/h4>\n<p>\u041f\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434. \u0422\u0440\u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b \u00b12% \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 &#8212; <strong>+42% \u043f\u0440\u044b\u0436\u043e\u043a mlx-omni-server \u043c\u0435\u0436\u0434\u0443 iter01 \u0438 iter02<\/strong>:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b0\/93\/ad\/b093ad17c772b34fce2fe6ef16699282.png\" alt=\"\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/b0\/93\/ad\/b093ad17c772b34fce2fe6ef16699282.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/b0\/93\/ad\/b093ad17c772b34fce2fe6ef16699282.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c<\/figcaption><\/div>\n<\/figure>\n<p><strong>45 \u2192 63.7 tps.<\/strong> \u0411\u0435\u0437 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0431\u0435\u0437 \u0430\u043f\u0434\u0435\u0439\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u043f\u0440\u043e\u043c\u0442\u0430\u0445, \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e &#8212; \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0433\u0434\u0435 \u043f\u0440\u043e \u0431\u0430\u0433\u0438.<\/p>\n<h4>TTFT &#8212; \u043a\u0442\u043e \u043e\u0442\u043a\u043b\u0438\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">TTFT p50<\/p>\n<\/th>\n<th>\n<p align=\"left\">TTFT p95<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">mlx-vlm<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.2 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">90.5 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 decode<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">mlx-omni-server<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.3 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">93.2 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 + \u0431\u044b\u0441\u0442\u0440\u044b\u0439 decode<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">mlx-openai-server<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.7 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">91.2 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0443\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u0440\u0442, \u0435\u0441\u0442\u044c prompt cache<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Rapid-MLX<\/p>\n<\/td>\n<td>\n<p align=\"left\">36.0 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">128.9 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u2192 TTFT = total time<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">omlx<\/p>\n<\/td>\n<td>\n<p align=\"left\">38.7 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">44.9 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">vllm-mlx<\/p>\n<\/td>\n<td>\n<p align=\"left\">43.3 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">131.9 \u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 prefill<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u0443 Rapid-MLX \u0438 omlx TTFT \u0437\u0430\u0432\u044b\u0448\u0435\u043d \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0441\u0442\u0440\u0438\u043c\u044f\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 &#8212; \u043e\u0442\u0434\u0430\u044e\u0442 \u0431\u0443\u0444\u0435\u0440\u043e\u043c. \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442: \u0437\u0430\u043f\u0440\u043e\u0441 \u00ab\u0432\u0438\u0441\u0438\u0442\u00bb \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u043f\u043e\u0442\u043e\u043c \u043f\u0430\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0412 \u0447\u0430\u0442\u0435 \u044d\u0442\u043e \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u043f\u043e\u0434\u0432\u0438\u0441\u00bb.<\/p>\n<p>\u0415\u0441\u043b\u0438 latency \u0432\u0430\u0436\u043d\u0430 (\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 UI, \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u043f\u043b\u0438\u0442), \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 mlx-omni-server \u0438\u043b\u0438 mlx-openai-server.<\/p>\n<hr\/>\n<h3>Batch: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/h3>\n<p>\u0412\u043e\u0442 \u0433\u0434\u0435 \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 batcher \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c <strong>2\u00d7<\/strong> throughput \u043d\u0430 \u0434\u0432\u0443\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445. \u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 &#8212; \u0440\u0430\u0437\u043d\u0430\u044f:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/de\/d8\/37\/ded8379b5cd53001704c1badefcca710.png\" alt=\"Batch: \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442 2 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/de\/d8\/37\/ded8379b5cd53001704c1badefcca710.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/de\/d8\/37\/ded8379b5cd53001704c1badefcca710.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Batch: \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442 2 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>mlx-openai-server &#8212; 2.17\u00d7.<\/strong> \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 batcher \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 MLX. Double wall_tps (71.7) <strong>\u0432\u044b\u0448\u0435<\/strong> single wall_tps (62.6) &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u0449\u0435\u0433\u043e throughput, \u0447\u0435\u043c \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434\u0440\u044f\u0434. \u042d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 continuous batching: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e sequences \u0434\u0435\u043b\u044f\u0442 \u043e\u0434\u0438\u043d forward pass, GPU \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c &#8212; \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 + on-line merge \u0432 decode loop.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 &#8212; \u0442\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u0437\u043e\u043d\u0435 1.6-1.8\u00d7, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u043e \u0441\u0435\u0431\u044f \u043d\u0430\u0437\u0432\u0430\u043b <strong>partial batching<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>vllm-mlx (1.79\u00d7)<\/strong> &#8212; \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 prefix sharing \u0432 paged KV cache (\u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0434\u0438\u0442 \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 prefill \u043f\u0435\u0440\u0432\u043e\u0433\u043e) + pipelining (prefill \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 decode \u0434\u0440\u0443\u0433\u043e\u0433\u043e)<\/p>\n<\/li>\n<li>\n<p><strong>mlx-vlm (1.72\u00d7)<\/strong> &#8212; pipelined, \u0431\u0435\u0437 \u043e\u0431\u0449\u0435\u0433\u043e forward pass<\/p>\n<\/li>\n<li>\n<p><strong>omlx (1.64\u00d7)<\/strong> &#8212; partial batching \u0447\u0435\u0440\u0435\u0437 continuous batcher, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u0423 \u0432\u0441\u0435\u0445 \u0442\u0440\u043e\u0438\u0445 double wall_tps \u2248 single wall_tps (\u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043d\u0438\u0436\u0435). \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442: \u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u043e \u043e\u0431\u0449\u0438\u0439 throughput \u043d\u0435 \u0440\u0430\u0441\u0442\u0451\u0442 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u043b\u043e\u0442\u043e\u0432 \u0443 GPU.<\/p>\n<p><strong>Rapid-MLX (1.13\u00d7)<\/strong> &#8212; sequential queue. \u0414\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c: \u043f\u043e\u043a\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442, \u0432\u0442\u043e\u0440\u043e\u0439 \u0436\u0434\u0451\u0442. \u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e speedup \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435 1.0 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0438\u043d\u0438\u0448\u0438\u0440\u0443\u0435\u0442 (\u043f\u0440\u043e\u0433\u0440\u0435\u0432 \u043e\u0431\u0449\u0438\u0439), \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c.<\/p>\n<p><strong>mlx-omni-server (1.13\u00d7)<\/strong> &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u0412 iter01-iter04 \u0443 \u043d\u0435\u0433\u043e speedup <strong>0.849<\/strong> &#8212; \u044d\u0442\u043e \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f, \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f <strong>\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/strong> \u043e\u0434\u043d\u043e\u0433\u043e.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">iter01-04<\/p>\n<\/th>\n<th>\n<p align=\"left\">iter05<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>--workers<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">1 (default)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">single wall_tps<\/p>\n<\/td>\n<td>\n<p align=\"left\">64.01<\/p>\n<\/td>\n<td>\n<p align=\"left\">63.99<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">double wall_tps<\/p>\n<\/td>\n<td>\n<p align=\"left\">23.39<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>29.41<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">speedup<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0.849<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.132<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0420\u0430\u0437\u0433\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: FastAPI + uvicorn \u0441 <code>--workers 1<\/code> \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043e\u0434\u0438\u043d event loop, GPU \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0431\u0435\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430, \u043d\u043e \u0441 overhead \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041e\u0434\u0438\u043d \u0444\u043b\u0430\u0433 <code>--workers 2<\/code> &#8212; \u0438 \u0434\u0432\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0434\u0435\u043b\u044f\u0442 GPU fair-share. \u041d\u0435 batching, \u0430 time-sharing, \u043d\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u0435\u0437 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c <strong>\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/strong> &#8212; \u0432\u044b\u0431\u043e\u0440 \u043e\u0434\u0438\u043d, mlx-openai-server. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u043b\u0438 \u0434\u0435\u043b\u0438\u0442\u044c GPU \u043f\u043e\u043f\u043e\u043b\u0430\u043c.<\/p>\n<hr\/>\n<h3>\u041f\u044f\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e \u0431\u0430\u0433\u0438<\/h3>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u0412 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u0432\u0441\u043f\u043b\u044b\u043b\u043e \u043f\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c README. \u0422\u0440\u0438 \u0438\u0437 \u043d\u0438\u0445 &#8212; \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043b\u043e\u0432\u0443\u0448\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0440\u0442\u044f\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0438\u0445 \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/da\/f2\/08\/daf208d29d786912e134788d25e6d086.png\" alt=\"\u0422\u0440\u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/da\/f2\/08\/daf208d29d786912e134788d25e6d086.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/da\/f2\/08\/daf208d29d786912e134788d25e6d086.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u043e\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f 1 &#8212; mlx-serve: \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 attention \u0432 2026 \u0433\u043e\u0434\u0443<\/h4>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432 2026 \u0433\u043e\u0434\u0443 \u0432\u0441\u0435 LLM-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 flash attention. Flash attention &#8212; \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <code>Q \u00b7 K\u1d40<\/code> \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 attention \u043a\u0443\u0441\u043a\u0430\u043c\u0438 \u0441 <strong>O(N) \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043c\u0435\u0441\u0442\u043e O(N\u00b2)<\/strong>. \u041e\u043d \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 &#8212; PyTorch, JAX, MLX.<\/p>\n<p>\u0412 <code>mlx-serve<\/code> &#8212; \u043d\u0435\u0442. \u042f \u0437\u0430\u043b\u0435\u0437 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 Zig: \u0432 <code>src\/transformer.zig<\/code> attention-\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c: <code>heads \u00d7 seq\u00b2 \u00d7 4 bytes<\/code> (float32).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0439 Qwen 3.5 35B \u043d\u0430 \u043f\u0440\u043e\u043c\u0442\u0435 <code>30000_mmlu-pro.md<\/code> (52247 \u0442\u043e\u043a\u0435\u043d\u043e\u0432):<\/p>\n<ul>\n<li>\n<p>8 KV-\u0433\u043e\u043b\u043e\u0432, seq = 52247<\/p>\n<\/li>\n<li>\n<p>Attention-\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043d\u0430 <strong>\u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0439<\/strong>: <code>8 \u00d7 52247\u00b2 \u00d7 4 \u2248 87 GB<\/code><\/p>\n<\/li>\n<li>\n<p>KV-cache \u043d\u0430 \u0432\u0441\u0435 64 \u0441\u043b\u043e\u044f &#8212; \u0435\u0449\u0451 ~80 GB<\/p>\n<\/li>\n<li>\n<p>\u0418\u0442\u043e\u0433\u043e: <strong>~170 GB<\/strong> \u043d\u0430 64GB \u043c\u0430\u0448\u0438\u043d\u0435 \u2192 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <code>[METAL] Insufficient Memory<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <code>src\/server.zig:420<\/code> \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>checkAttentionMemory()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 RAM \u0438 \u0440\u0435\u0436\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u041d\u0430 64GB Mac \u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0451\u0442 \u043f\u043e\u0442\u043e\u043b\u043e\u043a <strong>19383 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/strong>. \u042d\u0442\u043e \u043d\u0435 \u043b\u0438\u043c\u0438\u0442 \u0436\u0435\u043b\u0435\u0437\u0430 &#8212; \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 attention, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c flash-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u043c\u0442\u0430 &#8212; <code>15000_gpqa<\/code> (19838 tok), <code>40000_swe-bench<\/code> (44914 tok) \u0438 <code>30000_mmlu-pro<\/code> (53269 tok) &#8212; mlx-serve \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f <code>transformer.zig<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d \u043e\u0442 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<p>\u041e\u0431\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 <code>--ctx-size 65536<\/code> \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u0444\u043b\u0430\u0433 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 pre-flight check, \u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 attention eval \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u0432 Metal OOM \u0438 \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>\u0423\u0440\u043e\u043a \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f: \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 LLM-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb, \u0430 \u043d\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 mlx-lm &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d <code>mlx.fast.scaled_dot_product_attention<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f 2 &#8212; vllm-mlx: \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0439 tps 14000<\/h4>\n<p>\u0412 iter01 \u044f \u0441\u043c\u043e\u0442\u0440\u044e \u0432 CSV vllm-mlx \u0438 \u0432\u0438\u0436\u0443: <code>gen_tps_p50 = 14909<\/code>. \u0414\u043b\u044f 35B \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 consumer Mac \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e &#8212; \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 80-100 tok\/s. \u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c: \u043c\u043e\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u0430\u0433\u043d\u0443\u0442.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0437 \u0432 raw SSE-\u043b\u043e\u0433 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 vllm-mlx:<\/p>\n<pre><code>data: {\"choices\":[{\"delta\":{\"role\":\"assistant\"},\"index\":0}]}[90 \u0441\u0435\u043a\u0443\u043d\u0434 \u0442\u0438\u0448\u0438\u043d\u044b]data: {\"choices\":[{\"delta\":{\"content\":\"...&lt;\u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 2048 \u0442\u043e\u043a\u0435\u043d\u043e\u0432&gt;...\"}}]}data: [DONE]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a &#8212; \u043f\u0443\u0441\u0442\u043e\u0439, \u0441 \u0440\u043e\u043b\u044c\u044e <code>assistant<\/code>. \u041f\u043e\u0442\u043e\u043c 90 \u0441\u0435\u043a\u0443\u043d\u0434 \u0442\u0438\u0448\u0438\u043d\u044b &#8212; \u0441\u0435\u0440\u0432\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0437\u0430 \u043a\u0443\u043b\u0438\u0441\u0430\u043c\u0438. \u041f\u043e\u0442\u043e\u043c <strong>\u0432\u0435\u0441\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u0438\u043c SSE-\u0447\u0430\u043d\u043a\u043e\u043c<\/strong> \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435.<\/p>\n<p>\u0425\u0430\u0440\u043d\u0435\u0441\u0441 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><code>t_first<\/code> = \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430 (\u043f\u043e\u0447\u0442\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e role assignment)<\/p>\n<\/li>\n<li>\n<p><code>t_end<\/code> = \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 data-\u0447\u0430\u043d\u043a\u0430 \u0441 2048 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><code>generation_time = t_end \u2212 t_first \u2248 0.07 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/code><\/p>\n<\/li>\n<li>\n<p><code>gen_tps = 2048 \/ 0.07 \u2248 14900<\/code><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430, \u0430 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 &#8212; \u043c\u0443\u0441\u043e\u0440.<\/strong><\/p>\n<p><strong>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c:<\/strong> <code>wall_tps<\/code> (\u043f\u043e\u043b\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043e\u0442\u0432\u0435\u0442\u0430) \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c &#8212; <code>1024 \/ 90 \u2248 50 tps<\/code>. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c vllm-mlx.<\/p>\n<p><strong>\u0418 TTFT \u0442\u043e\u0436\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d<\/strong> &#8212; \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u043d\u043a \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e prefill.<\/p>\n<p>\u0423\u0440\u043e\u043a: <code><strong>gen_tps<\/strong><\/code><strong> \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 streaming.<\/strong> \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0441\u0451 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 &#8212; \u0432\u044b \u043c\u0435\u0440\u0438\u0442\u0435 \u043d\u0435 decode-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0435\u0442\u0438. \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u044b\u0440\u043e\u0439 SSE-\u043b\u043e\u0433 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f 3 &#8212; \u0437\u043e\u043c\u0431\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 20GB RAM<\/h4>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0438\u0437 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b <code>iterate<\/code> \u043d\u0430 \u0448\u0435\u0441\u0442\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445, \u043f\u043e\u0448\u0451\u043b \u043f\u0438\u0442\u044c \u043a\u043e\u0444\u0435. \u0412\u0435\u0440\u043d\u0443\u043b\u0441\u044f &#8212; \u0441\u043c\u043e\u0442\u0440\u044e: <code>omlx<\/code> \u0438\u0434\u0451\u0442 \u0443\u0436\u0435 \u043f\u043e\u043b\u0447\u0430\u0441\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u0442\u0435. \u0427\u0442\u043e-\u0442\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u043b\u0438\u043f\u043b\u043e. \u041d\u0430\u0436\u0430\u043b Ctrl-C.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <code>app_inference<\/code> \u0443\u043c\u0435\u0440. Terminal \u0432\u0435\u0440\u043d\u0443\u043b prompt. \u0418\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0433\u043e\u043d.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442, \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c &#8212; <code>[METAL] Insufficient Memory<\/code>. \u0421\u0442\u0440\u0430\u043d\u043d\u043e &#8212; \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430. \u0421\u043c\u043e\u0442\u0440\u044e <code>vm_stat<\/code>:<\/p>\n<pre><code>Pages free: 512 MBPages wired down: 12 GBPages active: 18 GB    \u2190 ???<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>18GB active &#8212; \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0439 4-bit \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 unified memory. \u041d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <code>app_inference<\/code> \u0443\u043c\u0435\u0440. \u041a\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u0442?<\/p>\n<pre><code class=\"bash\">ps aux | grep -E \"frameworks\/(omlx|higgs|vllm-mlx|mlx-serve)\"user 12345  omlx serve --model ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Subprocess <code>omlx serve<\/code> <strong>\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u0436\u0438\u0442\u044c<\/strong>. Parent \u0443\u043c\u0435\u0440, \u043d\u043e subprocess \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0432 init (PID 1) \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c &#8212; \u0434\u0435\u0440\u0436\u0430\u043b 35B \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u043b <strong>~20GB RAM<\/strong>.<\/p>\n<p>\u0421\u0442\u043e\u043f. 64GB \u2212 20GB (\u0437\u043e\u043c\u0431\u0438) = 44GB \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e. \u0410 \u043d\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c + KV cache \u2248 45GB. OOM.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044f\u0432\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430:<\/p>\n<pre><code class=\"bash\">ps aux | grep -E \"frameworks\/(omlx|higgs|vllm-mlx|mlx-serve|mlx-openai|mlx-omni|Rapid-MLX)\" | grep -v grep# \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0448\u043b\u043e\u0441\u044c - kill &lt;pid&gt;, \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f vm_stat<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b post-run cleanup, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 subprocess, \u0432 \u043f\u0443\u0442\u0438 \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0435\u0441\u0442\u044c <code>frameworks\/<\/code>. \u041c\u043e\u0440\u0430\u043b\u044c: <strong>35B \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u00ab\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u00bb \u0442\u0440\u0435\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 Mac.<\/strong> \u041d\u0438 \u043e\u0434\u0438\u043d README \u043f\u0440\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0435\u0442, \u0430 \u043d\u0430 64GB \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f 4 &#8212; omlx: hardcoded ctx window 32768<\/h4>\n<p>\u042d\u0442\u043e \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 omlx \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u0435\u0435\u0442 <code>6\/8 OK<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>8\/8<\/code>. \u0414\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u043c\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 HTTP 400:<\/p>\n<pre><code class=\"json\">{  \"error\": {    \"message\": \"Prompt too long: 52247 tokens exceeds max context window of 32768 tokens\"  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b &#8212; ctx window \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433, \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c CLI-\u0444\u043b\u0430\u0433. \u0421\u043c\u043e\u0442\u0440\u044e:<\/p>\n<pre><code class=\"bash\">omlx serve --help<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u043d\u0438\u043a\u0430\u043a\u0438\u0445 <code>--ctx-size<\/code>, <code>--max-ctx<\/code>, <code>--context-window<\/code>. \u041b\u0438\u043c\u0438\u0442 \u0437\u0430\u0448\u0438\u0442 \u043b\u0438\u0431\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u043b\u0438\u0431\u043e \u0432 \u043a\u043e\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0411\u0435\u0437 \u043f\u0430\u0442\u0447\u0430 \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u043c\u0442\u044b? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 <code>mlx-lm<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 <code>max_position_embeddings<\/code> \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0432\u0435\u0442 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435. omlx \u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 explicit check \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448 workload \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0442\u044b (&gt;32k) &#8212; omlx \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u044f\u0442 \u0444\u043b\u0430\u0433.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0440\u0438\u044f 5 &#8212; mlx-omni-server: autodetect \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c<\/h4>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0440\u044b\u0436\u043a\u0443 <code>45 \u2192 63.7 tps<\/code> \u043c\u0435\u0436\u0434\u0443 iter01 \u0438 iter02. \u0412 iter01 \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>GET \/v1\/models<\/code> \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f <code>model_id<\/code>. mlx-omni-server \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <strong>\u043f\u0435\u0440\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0437 \u043a\u044d\u0448\u0430<\/strong> <code>~\/.lmstudio\/models\/<\/code>. \u0410 \u0432 \u043a\u044d\u0448\u0435 \u0443 \u043c\u0435\u043d\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>Qwen3.5-35B-A3B-4bit<\/code>, \u043d\u043e \u0438 <code>Qwen3.5-35B-A3B-**8bit**<\/code> (\u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432).<\/p>\n<p>\u0425\u0430\u0440\u043d\u0435\u0441\u0441 \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 8bit \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043d\u0435\u0451. 8-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u0435\u0441\u0438\u0442 ~40GB \u0432\u043c\u0435\u0441\u0442\u043e 20GB \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <strong>\u043d\u0430 42% \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/strong> \u043d\u0430 Apple Silicon.<\/p>\n<p>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e &#8212; \u0433\u043b\u044f\u043d\u0443\u043b <code>server.log<\/code>:<\/p>\n<pre><code>[INFO] Loaded model: mlx-community\/Qwen3.5-35B-A3B-8bit<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u043e\u0436\u0438\u0434\u0430\u043b <code>...4bit<\/code>. \u0424\u0438\u043a\u0441 &#8212; \u044f\u0432\u043d\u044b\u0439 <code>model_alias<\/code> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0447\u0442\u043e\u0431\u044b autodetect \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b:<\/p>\n<pre><code class=\"yaml\">mlx-omni-server:  model_alias: mlx-community\/Qwen3.5-35B-A3B-4bit<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 iter02 &#8212; <code>45 \u2192 63.7 tps<\/code>. <strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u044b\u0433\u043d\u0443\u043b\u0438 \u043d\u0435 \u0438\u0437-\u0437\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/strong><\/p>\n<p>\u0423\u0440\u043e\u043a \u0441\u043a\u0443\u0447\u043d\u044b\u0439, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0439: <strong>\u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435, \u043a\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0441\u0435\u0440\u0432\u0435\u0440.<\/strong> Autodetect \u0432 MLX-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u0431\u0435\u0440\u0451\u0442 \u00ab\u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e\u00bb \u0438\u0437 \u043a\u044d\u0448\u0430 LM Studio. \u0415\u0441\u043b\u0438 \u0442\u0430\u043c \u043b\u0435\u0436\u0430\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 &#8212; \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0434\u0443\u043c\u0430\u0435\u0442\u0435.<\/p>\n<hr\/>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b: \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c<\/h3>\n<p>\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u041f\u044f\u0442\u044c \u043e\u0441\u0435\u0439, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 0\u20261: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u0430, \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u043e\u0441\u0442\u044c (\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 TTFT), \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0447\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/e3\/a3\/8a\/e3a38a84e5b2d9ab79c666b2b5d3e48b.png\" alt=\"Scorecard: \u043f\u044f\u0442\u044c \u043e\u0441\u0435\u0439, \u043e\u0434\u0438\u043d \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/e3\/a3\/8a\/e3a38a84e5b2d9ab79c666b2b5d3e48b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/e3\/a3\/8a\/e3a38a84e5b2d9ab79c666b2b5d3e48b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Scorecard: \u043f\u044f\u0442\u044c \u043e\u0441\u0435\u0439, \u043e\u0434\u0438\u043d \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<p><strong>Overall winner &#8212; mlx-openai-server.<\/strong> \u041d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430 single (mlx-omni \u0447\u0443\u0442\u044c \u0432\u043f\u0435\u0440\u0435\u0434\u0438 &#8212; 64 vs 63), \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d <strong>\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0431\u0430\u0442\u0447\u0438\u0442<\/strong> (2.17\u00d7 \u0432\u043c\u0435\u0441\u0442\u043e 1.1-1.8 \u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445), <strong>\u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u0440\u043e\u043c\u0442\u044b<\/strong> (8\/8 vs 6\/8 \u0443 omlx), <strong>\u0447\u0435\u0441\u0442\u043d\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u0442<\/strong> (\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 gen_tps 75, \u0430 \u043d\u0435 \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435 15000), \u0438 <strong>\u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d<\/strong> (\u00b10.2% \u043c\u0435\u0436\u0434\u0443 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438).<\/p>\n<p>\u041d\u043e \u00ab\u043e\u0434\u0438\u043d \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0441\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438\u00bb &#8212; \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0434\u0430. \u0412\u043e\u0442 \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u044b\u0431\u043e\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u0447\u0435\u043c\u0443<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (LiteLLM\/gateway)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>mlx-openai-server<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 batcher (2.17\u00d7)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, latency \u0432\u0430\u0436\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>mlx-omni-server<\/strong> (<code>--workers 2<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u0443\u0447\u0448\u0438\u0439 TTFT (7.3\u0441) + top single tps (64)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Research \/ \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">mlx-openai-server \u0438\u043b\u0438 mlx-omni-server<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 TTFT, gen_tps, wall_tps<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (&gt;32k \u0442\u043e\u043a\u0435\u043d\u043e\u0432)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u043e\u043c\u0435 omlx \u0438 mlx-serve<\/p>\n<\/td>\n<td>\n<p align=\"left\">omlx &#8212; ctx 32k, mlx-serve &#8212; OOM<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">Rapid-MLX<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>rapid-mlx serve &lt;model&gt;<\/code> \u0438 \u0433\u043e\u0442\u043e\u0432\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Dual API (OpenAI + Anthropic)<\/p>\n<\/td>\n<td>\n<p align=\"left\">mlx-omni-server<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441 Anthropic endpoint<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u0435\u0437 Python runtime<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043a\u0430 \u043d\u0438\u043a\u0442\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0416\u0434\u0430\u0442\u044c higgs + qwen3_5_moe, \u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c flash attention \u0432 mlx-serve<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0427\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 &#8212; \u0447\u0435\u0441\u0442\u043d\u043e: \u044f \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b batch &gt;2 (\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 multi-user \u044d\u0442\u043e 4-8 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445), \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b \u0441 llama.cpp (\u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e MLX-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443), \u043d\u0435 \u0434\u0435\u043b\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 (\u0432\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0443 \u043c\u043e\u0434\u0435\u043b\u044c, \u0442\u0435\u043a\u0441\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 &#8212; \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u043f\u043e <code>max_tokens<\/code>).<\/p>\n<hr\/>\n<h3>\u0411\u043e\u043d\u0443\u0441: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c Python<\/h3>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435. Python-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0445\u043e\u0440\u043e\u0448\u0438\u0435, \u043d\u043e \u0442\u044f\u0436\u0451\u043b\u044b\u0435: torch, transformers, ffmpeg, <strong>2.5GB \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/strong>, GIL, \u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 10+ \u0441\u0435\u043a\u0443\u043d\u0434. Rust-\u0441\u0435\u0440\u0432\u0435\u0440 <code>higgs<\/code> &#8212; <strong>single binary, 30MB, \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e<\/strong> &#8212; \u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>qwen3_5_moe<\/code>. Zig-\u0441\u0435\u0440\u0432\u0435\u0440 <code>mlx-serve<\/code> &#8212; \u0431\u044b\u0441\u0442\u0440\u044b\u0439, \u043d\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 attention.<\/p>\n<p>\u041d\u0435\u0445\u0432\u0430\u0442\u043a\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430: <strong>single binary \u043d\u0430 Rust + MLX, \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 Qwen 3.5 MoE, \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c continuous batching<\/strong>. \u042f \u043d\u0430\u0447\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043a higgs \u0441 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437 mlx-openai-server &#8212; prompt cache (prefix-trie + LRU), request queue \u043d\u0430 tokio mpsc, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 qwen3_5_moe \u0432 mlx-rs, tool\/reasoning parser.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430 7-10 \u043d\u0435\u0434\u0435\u043b\u044c. \u041a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0446\u0438\u0444\u0440\u044b &#8212; \u043d\u0430\u043f\u0438\u0448\u0443 \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, <code>Rust vs Python \u0434\u043b\u044f LLM inference - \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a<\/code>. \u0410 \u043f\u043e\u043a\u0430 &#8212; \u0432\u043e\u0442 \u044d\u0442\u043e\u0442.<\/p>\n<hr\/>\n<h3>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0443 \u0441\u0435\u0431\u044f<\/h3>\n<p>\u0412\u0441\u0451 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e.  <a href=\"https:\/\/github.com\/yaruslove\/qwen3.5-bench-8-mlx-server-mac\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a> \u0441 \u0445\u0430\u0440\u043d\u0435\u0441\u0441\u043e\u043c, \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u0440\u043e\u043c\u0442\u0430\u043c\u0438 \u0438 gold-\u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043b\u0435\u0436\u0438\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e. \u0417\u0430\u043f\u0443\u0441\u043a:<\/p>\n<pre><code class=\"bash\">cd app_inferenceuv run -m app_inference run --config config\/iteration_05.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <code>data_test\/results\/NNN_iterXX_YYYYMMDD_HHMMSS\/<\/code> &#8212; \u043f\u043e\u043b\u043d\u044b\u0439 CSV per request, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043b\u043e\u0433\u0438, \u043e\u0442\u0432\u0435\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0441\u043d\u0438\u043c\u043e\u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0425\u043e\u0442\u0438\u0442\u0435 auto-tune (harness \u0441\u0430\u043c \u0443\u0434\u0432\u043e\u0438\u0442 <code>max_tokens<\/code> \u043f\u0440\u0438 truncation \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a):<\/p>\n<pre><code class=\"bash\">uv run -m app_inference iterate --rounds 6 --config config\/iteration_01.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u043c\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u044e &#8212; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0438\u0441\u043b\u0430. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b.<\/p>\n<hr\/>\n<p><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438.<\/strong> \u0415\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e &#8212; \u043f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043b\u044e\u0441, \u044d\u0442\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u0425\u0430\u0431\u0440\u0443, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 long-read \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u044b. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f &#8212; \u043f\u0440\u043e Rust-\u0441\u0435\u0440\u0432\u0435\u0440 MLX-inferene \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u043e\u0434. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e \u0447\u0442\u043e-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 (llama.cpp \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435? batch &gt;2? \u043a\u0432\u0430\u043d\u0442\u0438\u0437\u0430\u0446\u0438\u044f 8bit vs 4bit \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e?) &#8212; \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<p>\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\/1024880\/\">https:\/\/habr.com\/ru\/articles\/1024880\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u0430\u043d\u043e: MacBook Pro 16&#8243; M2 Max, 64GB unified memory, \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0433\u043e\u043d\u044f\u0442\u044c Qwen 3.5 35B moe \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u043a inference-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f MLX &#8212; \u0448\u0442\u0443\u043a \u0432\u043e\u0441\u0435\u043c\u044c, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 README \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u00abblazing fast\u00bb. \u042f \u0432\u0437\u044f\u043b \u0432\u0441\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430 \u0432\u043e\u0441\u044c\u043c\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u043f\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f \u0443\u0434\u0438\u0432\u0438\u043b\u0438.\u0433\u0438\u0442 \u043c\u043e\u0435\u0433\u043e \u0431\u0435\u043d\u0447\u0430: https:\/\/github.com\/yaruslove\/qwen3.5-bench-8-mlx-server-mac\u0421\u0440\u0430\u0437\u0443 \u0441\u043d\u0438\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u00ab\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 llama.cpp?\u00bb llama.cpp \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u043d\u0430 Apple Silicon MLX \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 10-30%, \u0443\u043c\u0435\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 continuous batching \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u043e\u0434 unified memory &#8212; \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 GGUF. \u0421\u0442\u0430\u0442\u044c\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e MLX-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443: \u0442\u0430\u043c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 llama.cpp &#8212; \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0438 \u044f \u0435\u0451 \u043d\u0435 \u0438\u0437\u0431\u0435\u0433\u0430\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e.\u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f 35B &#8212; \u0442\u0440\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:Privacy. \u0412 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0442 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u044b, \u0422\u0417, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u044d\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0432 ChatGPT \u0438\u043b\u0438 Claude. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u0435\u043a: \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0424\u0418\u041e, \u0441\u0447\u0435\u0442\u0430, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.Coding-\u0430\u0433\u0435\u043d\u0442\u044b \u0438 open-code. Claude \u0438 GPT \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0445\u043e\u0440\u043e\u0448\u0438, \u043f\u043e\u043a\u0430 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0433\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u0432\u043e\u0441\u0435\u043c\u044c \u0447\u0430\u0441\u043e\u0432 &#8212; \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0444\u0435\u0439\u043d\u044b\u0435 \u0437\u0451\u0440\u043d\u0430. \u0412\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 open-source \u0442\u0443\u043b\u044b \u0434\u043b\u044f AI-\u043a\u043e\u0434\u0438\u043d\u0433\u0430 &#8212; OpenCode, Aider, Claude Code &#8212; \u0443\u043c\u0435\u044e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c\u0443 endpoint. \u0421\u0442\u0430\u0432\u0438\u0448\u044c base_url: http:\/\/mac.local:8000\/v1 \u0438 \u0441\u0432\u043e\u0439 API-\u043a\u043b\u044e\u0447 &#8212; \u0430\u0433\u0435\u043d\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0443\u0436\u0435 \u043e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0431\u0435\u0437 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 rate-limit\u2019\u043e\u0432. \u041d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u043c\u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u043d\u044f\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 LLM: \u0441 \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0431\u044b\u043b GLM 4.7 Flash \u043d\u0430 4090, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044f\u044e Qwen 3.5 35B \u043d\u0430 Mac.\u041d\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e RTT. 35B \u0432 4-\u0431\u0438\u0442 \u043d\u0430 M2 Max \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0436\u0438\u0432\u0435\u0435 \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 API \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0440\u0430\u0443\u043d\u0434-\u0442\u0440\u0438\u043f\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b &#8212; \u044d\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u0433\u0438\u044f.\u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e: \u0442\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438\u0434\u0443\u0442 \u043d\u043e\u0437\u0434\u0440\u044f \u0432 \u043d\u043e\u0437\u0434\u0440\u044e \u043d\u0430 single-user, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 &#8212; \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u043e \u0438\u0437 \u0448\u0435\u0441\u0442\u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0434\u0438\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0432 2.17\u00d7 speedup, \u0430 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 0.85\u00d7, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u0430\u0448\u044c \u0435\u043c\u0443 &#8212;workers 2. \u041f\u043e \u0445\u043e\u0434\u0443 \u0432\u0441\u043f\u043b\u044b\u043b\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 attention \u0432 2026 \u0433\u043e\u0434\u0443, \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435 14000 tokens\/sec \u0438\u0437-\u0437\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 SSE-\u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0438 \u0437\u043e\u043c\u0431\u0438-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 20GB RAM, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c README.\u0422\u0440\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 2% &#8212; \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e single user\u042d\u0442\u043e single-user. \u0421 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f &#8212; \u043d\u043e \u0434\u043e \u043d\u0435\u0451 \u0434\u043e\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f.\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. Mac &#8212; \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 LLM-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0432\u0435\u0440\u0445\u0443 LiteLLM-\u0433\u0435\u0439\u0442\u0432\u0435\u0439, \u0434\u0430\u043b\u044c\u0448\u0435 VPS \u0441 \u0431\u0435\u043b\u044b\u043c IP &#8212; \u0447\u0442\u043e\u0431\u044b \u0434\u0451\u0440\u0433\u0430\u0442\u044c Qwen \u043f\u043e API \u043a\u0430\u043a Open-AI compatiable \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435: OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 endpoint (\/v1\/chat\/completions), \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c.\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b &#8212; mlx-vlm. \u042d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f vision-\u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u043e \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b 15\u201325 tps, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0430\u0434\u0430\u0435\u0442, LiteLLM \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u0442, \u043d\u043e \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u042f\u0441\u043d\u043e \u0441\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e: \u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439.\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 mlx-vlm &#8212; MLX-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u0440\u043e \u0432\u044b\u0431\u043e\u0440 MLX \u0432\u043c\u0435\u0441\u0442\u043e llama.cpp \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0441\u044c; \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0438\u0432\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a &#8212; \u043d\u0430\u0448\u0451\u043b Reddit \u0442\u0440\u0435\u0434 \u043d\u0430 r\/LocalLLaMA, \u0433\u0434\u0435 \u043d\u0430\u0440\u043e\u0434 \u043c\u0435\u0440\u044f\u0435\u0442 2\u00d7 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043d\u0430 Qwen 3.5 35B. \u0412\u0430\u0436\u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u043e\u0435: MLX-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e. \u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u044f \u0443\u0437\u043d\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0430\u043b \u043a\u043e\u043f\u0430\u0442\u044c.\u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0433\u0430\u0434\u0430\u0442\u044c \u043f\u043e README, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0438\u0441\u0430\u043b \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u0430\u043a subprocess, \u0436\u0434\u0451\u0442 healthcheck \u043d\u0430 \/v1\/models, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u0432\u043e\u0441\u0435\u043c\u044c \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u0432 single-\u0440\u0435\u0436\u0438\u043c\u0435, \u043f\u043e\u0442\u043e\u043c \u0442\u0435 \u0436\u0435 \u043f\u0430\u0440\u044b \u0432 \u0434\u0432\u043e\u0439\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 asyncio-\u0431\u0430\u0440\u044c\u0435\u0440, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 CSV \u0438 \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u0418 \u0442\u0430\u043a \u0448\u0435\u0441\u0442\u044c \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434, \u043f\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.\u041a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u043c\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0438\u0442\u044c: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 MLX, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441 NVIDIA\u0415\u0441\u043b\u0438 \u0444\u043e\u043d\u043e\u043c \u0443 \u0432\u0430\u0441 CUDA \u0438 PyTorch &#8212; \u0432\u043e\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043c\u0438\u0440\u0430 Apple Silicon:Metal &#8212; \u044d\u0442\u043e Apple-\u0441\u043a\u0438\u0439 CUDA. GPU-API \u0447\u0438\u043f\u0430 M-series, \u043d\u0430 \u043d\u0451\u043c \u0438\u0434\u0443\u0442 \u0432\u0441\u0435 matmul \u0438 attention. \u0410\u043d\u0430\u043b\u043e\u0433 CUDA Toolkit.MLX &#8212; \u044d\u0442\u043e Apple-\u0441\u043a\u0438\u0439 PyTorch + CUDA runtime \u0432 \u043e\u0434\u043d\u043e\u043c \u043b\u0438\u0446\u0435. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Apple \u0434\u043b\u044f ML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 Metal. \u0412\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430: mlx-lm \u0434\u043b\u044f LLM (\u0430\u043d\u0430\u043b\u043e\u0433 HuggingFace Transformers), mlx.fast &#8212; \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f flash attention (\u0430\u043d\u0430\u043b\u043e\u0433 cuDNN).Unified memory &#8212; \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 NVIDIA. \u041d\u0430 RTX \u0443 \u0432\u0430\u0441 24GB VRAM \u0438 64GB RAM \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432 \u0438\u0437 RAM \u0432 VRAM &#8212; \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u0447\u0435\u0440\u0435\u0437 cudaMemcpy. \u041d\u0430 M-series CPU \u0438 GPU \u0434\u0435\u043b\u044f\u0442 \u043e\u0434\u0438\u043d \u043f\u0443\u043b \u043f\u0430\u043c\u044f\u0442\u0438. 35B-\u043c\u043e\u0434\u0435\u043b\u044c \u0432 20GB \u043b\u0435\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0431\u043e\u0438\u043c &#8212; \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043f\u0438\u0439.\u041f\u043e\u0447\u0435\u043c\u0443 GPU \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 CPU \u043d\u0430 LLM? \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u043e\u043d \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u043b\u043e\u0451\u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0445 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0439. \u0423 CPU \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0434\u0435\u0440 \u0441 \u043a\u0435\u0448\u0435\u043c, \u0443 GPU &#8212; \u0442\u044b\u0441\u044f\u0447\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u044f\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0440\u0443\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u041e\u0434\u043d\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 CPU \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435; \u0431\u0430\u0442\u0447 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 &#8212; GPU \u0431\u044c\u0451\u0442 CPU \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437. M2 Max \u0434\u0430\u0451\u0442 ~400 GB\/s memory bandwidth &#8212; \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u0442\u0430\u0439\u043c-\u0434\u0435\u043a\u043e\u0434 35B \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 50-80 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041d\u0430 CPU \u0442\u043e\u0439 \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b \u0431\u044b \u0436\u0434\u0430\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 10-20 \u0440\u0430\u0437 \u0434\u043e\u043b\u044c\u0448\u0435.\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u044e\u0430\u043d\u0441: Metal \u043d\u0435 \u0448\u0430\u0440\u0438\u0442 GPU-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0448\u0435\u0441\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 &#8212; \u0434\u0432\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0436\u0435\u043b\u0435\u0437\u043a\u0435.\u041d\u0438\u0436\u0435 &#8212; \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e.\u0427\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c: \u0432\u043e\u0441\u0435\u043c\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432\u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0428\u0435\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0434\u0432\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b &#8212; \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043d\u0438\u0436\u0435.\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u042f\u0437\u044b\u043a\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0438\u0447\u0430\u0412 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435mlx-openai-serverPython 3.11Queue-batcher, image gen (Flux), multi-model+mlx-omni-serverPython 3.11+Dual API &#8212; OpenAI + Anthropic \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435+Rapid-MLXPython 3.10+\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430, 1900+ \u0442\u0435\u0441\u0442\u043e\u0432, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 (Cursor, Aider)+vllm-mlxPython 3.10+vLLM-style, paged KV cache, multimodal+omlxPythonTiered KV cache (RAM + SSD), admin dashboard-mlx-vlmPython 3.10+Fine-tuning VLM, 40+ \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440+higgsRustSingle binary, \u0431\u0435\u0437 Python- \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043dmlx-serveZigNative, agent mode, \u0431\u0435\u0437 Python- \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442 &#8212; \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0442\u043e \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0431\u0435\u0437 \u0432\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 README:\u041b\u0430\u043d\u0434\u0448\u0430\u0444\u0442: 8 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u00d7 6 \u0444\u0438\u0447\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u0440\u043e\u0442\u043a\u043e.mlx-openai-server &#8212; drop-in \u0437\u0430\u043c\u0435\u043d\u0430 OpenAI API. \u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c continuous batching (\u0441\u0440\u0430\u0437\u0443 \u0441\u043f\u043e\u0439\u043b\u0435\u0440 &#8212; \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442), speculative decoding \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f, multi-model \u0447\u0435\u0440\u0435\u0437 YAML, structured output \u0447\u0435\u0440\u0435\u0437 outlines. \u041c\u0438\u043d\u0443\u0441 &#8212; \u0436\u0451\u0441\u0442\u043a\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Python 3.11 \u0438 \u0442\u0430\u0449\u0438\u0442 torchvision + ffmpeg \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445.mlx-omni-server &#8212; \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441 \u0434\u0432\u043e\u0439\u043d\u044b\u043c API: \/v1\/* \u0432 \u0441\u0442\u0438\u043b\u0435 OpenAI \u0438 \/anthropic\/v1\/* \u0434\u043b\u044f Claude-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041f\u043b\u044e\u0441 TTS\/STT \u0438 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438. \u041d\u044e\u0430\u043d\u0441 \u0441 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c &#8212; \u043d\u0438\u0436\u0435 \u0446\u0435\u043b\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.Rapid-MLX &#8212; \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u00ab\u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00bb: rapid-mlx serve &lt;model&gt;. 1900+ \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u0435, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Cursor, Claude Code, Aider, Open WebUI, LibreChat. \u041c\u0438\u043d\u0443\u0441 &#8212; \u043d\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u0447\u0430\u043d\u043a\u0438 \u0442\u043e\u043a\u0435\u043d-\u0437\u0430-\u0442\u043e\u043a\u0435\u043d\u043e\u043c, \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0435\u0441\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0434\u043d\u0438\u043c \u043a\u0443\u0441\u043a\u043e\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e gen_tps \u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0435 \u043c\u0435\u0440\u0438\u0442 (\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 0), \u0430 TTFT \u0443 \u043d\u0435\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.vllm-mlx &#8212; vLLM-style inference, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 Apple Silicon. Paged KV cache \u0441 prefix sharing, \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c (text + image + video + audio), Anthropic Messages API. \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 &#8212; \u0442\u0430\u0449\u0438\u0442 torch \u043d\u0430 2.5GB \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0435\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0430\u0433 \u0432 SSE streaming, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0435 14000 tokens\/sec. \u041f\u0440\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.omlx &#8212; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: tiered KV cache, \u0433\u0434\u0435 \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432 RAM, \u0445\u043e\u043b\u043e\u0434\u043d\u0430\u044f &#8212; \u043d\u0430 SSD \u0432 safetensors. Multi-model \u0441 LRU-\u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c, \u0432\u0435\u0431-\u0434\u0430\u0448\u0431\u043e\u0440\u0434, tool calling + MCP. Requires macOS 15 (Sequoia). \u041a\u0440\u0438\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; hardcoded ctx window 32768 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u043c\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 HTTP 400.mlx-vlm &#8212; \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f Vision Language Models (\u0432\u043a\u043b\u044e\u0447\u0430\u044f fine-tuning), \u0430 \u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 40+ \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440. \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u0438 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0442\u0430\u0445 (30k+ \u0442\u043e\u043a\u0435\u043d\u043e\u0432) \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 pathological prefill slowdown &#8212; \u044f \u0432\u0438\u0434\u0435\u043b 31 \u043c\u0438\u043d\u0443\u0442\u0443 \u043d\u0430 prefill 52k \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u0440\u0438\u0447\u0451\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0430\u0447\u0435\u0442 790 \u2192 3.5 \u2192 790 \u2192 3.5 tok\/s, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e GC \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434.higgs (Rust) &#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d. \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0440\u043e\u0432\u0430\u043b \u043d\u043e \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 Rust-\u0441\u0435\u0440\u0432\u0435\u0440: single binary, zero Python runtime, TUI-\u0434\u0430\u0448\u0431\u043e\u0440\u0434, structured output \u043d\u0430 json_schema \u0441 100% compliance. \u0412 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u0444\u0440\u0430\u0445 &#8212; 755 tok\/s \u043d\u0430 8 concurrent. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0438\u0434\u043d\u0430\u044f: \u0432 registry \u0435\u0441\u0442\u044c qwen3, qwen3_moe \u0438 qwen3_next &#8212; \u043d\u043e \u043d\u0435\u0442 qwen3_5_moe. \u041d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 &#8212; \u0432\u0435\u0440\u043d\u0451\u043c \u0432 \u0431\u043e\u0439.mlx-serve (Zig) &#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d. \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 Zig, zero Python, MLX Core macOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 agent mode \u0438 \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a, \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.\u041a\u0430\u043a \u044f \u043c\u0435\u0440\u0438\u043b: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a-\u0445\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430 Python\u041c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 &#8212;  mlx-community\/Qwen3.5-35B-A3B-4bit. MoE \u0441 3B \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 35B, 4-bit \u043a\u0432\u0430\u043d\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0432 RAM \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~20GB. \u0412\u044b\u0431\u043e\u0440 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439: \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 64GB \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c \u043f\u043e\u0434 KV cache, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 MLX-\u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0448\u0435\u0441\u0442\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438.\u0416\u0435\u043b\u0435\u0437\u043e &#8212; Apple Mac M-series, 64GB unified memory. \u0412\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u0435\u043b\u044f\u0442 \u043e\u0434\u043d\u0443 GPU (Metal), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438: \u043e\u0434\u0438\u043d \u0437\u0430 \u0440\u0430\u0437.\u0425\u0430\u0440\u043d\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f app_inference, \u044d\u0442\u043e ~700 \u0441\u0442\u0440\u043e\u043a Python \u043d\u0430 httpx, pyyaml, rich, psutil. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f:YAML config \u2192 Runner \u2192 Launcher \u2192 Healthcheck \u2192 Scenarios \u2192 Metrics \u2192 Summary \u2192 AnalyzeLauncher \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 subprocess \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 stdout \u0432 server.log, \u0436\u0434\u0451\u0442 \/v1\/models (healthcheck \u043a\u0430\u0436\u0434\u044b\u0435 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0442\u0430\u0439\u043c\u0430\u0443\u0442 600\u0441), \u043f\u043e\u0442\u043e\u043c \u0433\u0430\u0441\u0438\u0442 SIGTERM \u2192 15\u0441 \u2192 SIGKILL.Client \u0434\u0435\u043b\u0430\u0435\u0442 POST \/v1\/chat\/completions \u0441 stream: true, \u043f\u0430\u0440\u0441\u0438\u0442 SSE \u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0440\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430: \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 (t_start), \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u0451\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d (t_first &#8212; \u043e\u0442\u0441\u044e\u0434\u0430 TTFT), \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f (t_end).Scenarios \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442 \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430. run_single &#8212; \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, 8 \u043f\u0440\u043e\u043c\u0442\u043e\u0432 \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c. run_double_batch &#8212; \u0434\u0432\u0430 \u043f\u0440\u043e\u043c\u0442\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 asyncio-\u043b\u043e\u0430\u0434\u0435\u0440:gate = asyncio.Event()task_a = create_task(chat_stream(&#8230;, start_gate=gate))task_b =&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-476407","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476407","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=476407"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476407\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=476407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=476407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=476407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}