{"id":500333,"date":"2026-10-26T15:21:29","date_gmt":"2026-10-26T12:21:29","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500333"},"modified":"2026-10-26T15:21:29","modified_gmt":"2026-10-26T12:21:29","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500333","title":{"rendered":"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430. \u0427\u0430\u0441\u0442\u044c 7. \u0424\u0438\u043d\u0430\u043b. \u041e\u0444\u043b\u0430\u0439\u043d-\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430<\/h2>\n<h3>\u041e\u0444\u043b\u0430\u0439\u043d-\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0435\u043a\u0430 \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/strong>. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0435 Python-\u043f\u0430\u043a\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0430\u043d\u044b \u0432 <code>offline_packages\/<\/code>, \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u043f\u044b. \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u00ab\u0441\u043d\u0438\u043c\u043e\u043a\u00bb \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0435\u043a \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Debian 12.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e<\/h4>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>pip install open-webui<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 <strong>\u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043d\u043e\u0432\u043e<\/strong> \u2014 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043e\u0434\u043d\u0443 \u0432\u0435\u0440\u0441\u0438\u044e, \u0437\u0430\u0432\u0442\u0440\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u0414\u043b\u044f \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u044b \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e: <code>pip<\/code> \u043b\u0438\u0431\u043e \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 \u00abno internet\u00bb, \u043b\u0438\u0431\u043e (\u0435\u0441\u043b\u0438 \u043a\u044d\u0448 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439) \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p><strong>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430 (<\/strong><code><strong>offline_packages\/<\/strong><\/code><strong>)<\/strong> \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u0424\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439<\/strong> \u2014 <code>requirements.lock<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (<code>transformers==5.5.4<\/code>, <code>torch==2.11.0+cpu<\/code> \u0438 \u0442.\u0434.), \u0430 \u043d\u0435 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435\u00bb \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438<\/strong> \u2014 \u0432\u0441\u0435 <code>.whl<\/code> \u043b\u0435\u0436\u0430\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, <code>pip install --no-index --find-links=.\/offline_packages<\/code> \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a PyPI.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c<\/strong> \u2014 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u041e\u0421\/Python \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0440\u0435\u043f\u0443:<\/strong> \u0442\u043e\u043b\u044c\u043a\u043e <strong>Python-\u043f\u0430\u043a\u0435\u0442\u044b<\/strong>. \u041c\u043e\u0434\u0435\u043b\u0438, \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 <code>llama.cpp<\/code>\/<code>stable-diffusion.cpp<\/code>, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, HTML \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0447\u0435\u0440\u0435\u0437 <code>tar<\/code> \u0432\u0441\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430). <code>offline_packages\/<\/code> \u2014 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0430 \u00ab\u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\u00bb.<\/p>\n<h4>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 make_offline_packages.sh<\/h4>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 <strong>\u0441\u043d\u0438\u043c\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <\/strong><code><strong>venv<\/strong><\/code> \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 <code>offline_packages\/<\/code>:<\/p>\n<ol>\n<li>\n<p><code><strong>pip freeze &gt; requirements.lock<\/strong><\/code> \u2014 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0432 <code>venv<\/code>.<\/p>\n<\/li>\n<li>\n<p><code><strong>pip download -r requirements.lock<\/strong><\/code> \u2014 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 <strong>wheels<\/strong> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>--only-binary=:all:<\/strong><\/code> \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0447\u0430\u044e\u0442\u0441\u044f <code>.tar.gz<\/code> (sdist). \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435\u0442 wheel \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c <strong>\u0441\u0435\u0439\u0447\u0430\u0441<\/strong>, \u0430 \u043d\u0435 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p><code><strong>--extra-index-url <\/strong><\/code><a href=\"https:\/\/download.pytorch.org\/whl\/cpu\" rel=\"noopener nofollow\"><code><strong>https:\/\/download.pytorch.org\/whl\/cpu<\/strong><\/code><\/a> \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: <code>torch<\/code> \u0431\u0435\u0440\u0451\u0442\u0441\u044f <strong>\u0441 CPU-\u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/strong> (\u0432\u0435\u0440\u0441\u0438\u044f <code>+cpu<\/code>), \u0430 \u043d\u0435 \u0441 PyPI (CUDA-\u0432\u0435\u0440\u0441\u0438\u044f \u0441 <code>nvidia-*<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>Fallback \u043d\u0430 sdist<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 wheel \u043d\u0435\u0442, \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043a\u0430\u0447\u0430\u0435\u0442 <code>.tar.gz<\/code> \u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442, \u0447\u0442\u043e \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <code>gcc<\/code>, <code>python3-dev<\/code>, \u0430 \u0434\u043b\u044f <code>tokenizers<\/code> \u2014 <code>rustc<\/code>\/<code>cargo<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/strong> \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 <code>requirements.lock<\/code>. \u0415\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0435\u0442.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 <\/strong><code><strong>--extra-index-url<\/strong><\/code><strong>, \u0430 \u043d\u0435 <\/strong><code><strong>--index-url<\/strong><\/code><strong>.<\/strong> \u0421 <code>--index-url<\/code> pip \u0438\u0449\u0435\u0442 <strong>\u0442\u043e\u043b\u044c\u043a\u043e<\/strong> \u043d\u0430 PyTorch-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 <code>open-webui<\/code> (\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435\u0442). \u0421 <code>--extra-index-url<\/code> \u2014 \u0438\u0449\u0435\u0442 \u0432\u0435\u0437\u0434\u0435: <code>open-webui<\/code> \u043d\u0430 PyPI, <code>torch<\/code> \u043d\u0430 PyTorch-\u0438\u043d\u0434\u0435\u043a\u0441\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c <code>torch==2.11.0+cpu<\/code> (\u0441\u0443\u0444\u0444\u0438\u043a\u0441 <code>+cpu<\/code>) \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 CPU-\u0432\u0435\u0440\u0441\u0438\u044e, \u0438 CUDA \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u043d\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>\u041f\u0440\u043e \u00abno wheel\u00bb fallback.<\/strong> \u0412 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430 <code>open-webui + torch<\/code> \u043d\u0430 Debian 12 x86_64 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 wheels. Fallback \u043d\u0443\u0436\u0435\u043d \u043a\u0430\u043a \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0430: \u043b\u0443\u0447\u0448\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e sdist <strong>\u0441\u0435\u0439\u0447\u0430\u0441<\/strong> (\u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>python3-dev<\/code>), \u0447\u0435\u043c \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>error: command 'gcc' failed<\/code>.<\/p>\n<h4>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 make_offline_packages.sh<\/h4>\n<pre><code class=\"bash\">#!\/usr\/bin\/env bash# \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e venv \u0432 offline_packages\/.# \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043f\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0443.## Usage: .\/make_offline_packages.sh# Env:#   VENV_DIR=.\/venv          \u043f\u0443\u0442\u044c \u043a venv (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)#   OUT_DIR=.\/offline_packages  \u043a\u0443\u0434\u0430 \u043a\u0430\u0447\u0430\u0442\u044c#   PIP_EXTRA_INDEX_URL      \u0434\u043b\u044f CPU-torch (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e PyTorch CPU)set -euo pipefailSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" &amp;&amp; pwd)\"VENV_DIR=\"${VENV_DIR:-$SCRIPT_DIR\/venv}\"OUT_DIR=\"${OUT_DIR:-$SCRIPT_DIR\/offline_packages}\"REQ_FILE=\"$SCRIPT_DIR\/requirements.lock\"TORCH_INDEX=\"${PIP_EXTRA_INDEX_URL:-https:\/\/download.pytorch.org\/whl\/cpu}\"RED='\\033[0;31m'; GREEN='\\033[0;32m'; YELLOW='\\033[1;33m'; NC='\\033[0m'info()  { echo -e \"${GREEN}[INFO]${NC}  $*\"; }warn()  { echo -e \"${YELLOW}[WARN]${NC}  $*\"; }error() { echo -e \"${RED}[ERROR]${NC} $*\" &gt;&amp;2; exit 1; }[ -d \"$VENV_DIR\" ] || error \"venv \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d: $VENV_DIR\"PIP=\"$VENV_DIR\/bin\/pip\"[ -x \"$PIP\" ] || error \"pip \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d: $PIP\"mkdir -p \"$OUT_DIR\"# --- 1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 ---info \"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e $REQ_FILE \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f...\"\"$PIP\" freeze &gt; \"$REQ_FILE\"PKG_COUNT=$(wc -l &lt; \"$REQ_FILE\")info \"\u041f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435: $PKG_COUNT\"# --- 2. \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0451, \u043a\u0440\u043e\u043c\u0435 torch (\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e wheels) ---info \"\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u044e \u043f\u0430\u043a\u0435\u0442\u044b \u0432 $OUT_DIR (wheels)...\"#grep -v -i '^torch' \"$REQ_FILE\" &gt; \"$REQ_FILE.tmp\" || trueWHEEL_FAILED=()if [ -s \"$REQ_FILE\" ]; then    if ! \"$PIP\" download \\            --dest \"$OUT_DIR\" \\            --only-binary=:all: \\            --no-cache-dir \\            --extra-index-url \"$TORCH_INDEX\" \\            -r \"$REQ_FILE\"; then        warn \"\u041d\u0435 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0442 wheel. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u043e\u0432...\"        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0442\u0435, \u0443 \u043a\u043e\u0433\u043e \u043d\u0435\u0442 wheel        while IFS= read -r pkg; do            [ -z \"$pkg\" ] &amp;&amp; continue            if ! \"$PIP\" download \\                    --dest \"$OUT_DIR\" \\                    --only-binary=:all: \\                    --no-cache-dir \\                    \"$pkg\" &gt;\/dev\/null 2&gt;&amp;1; then                WHEEL_FAILED+=(\"$pkg\")            fi        done &lt; \"$REQ_FILE\"    fielse    warn \"\u0421\u043f\u0438\u0441\u043e\u043a \u0431\u0435\u0437 torch \u043f\u0443\u0441\u0442, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\"firm -f \"$REQ_FILE.tmp\"# --- 2b. Fallback: sdist \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0431\u0435\u0437 wheel ---if [ ${#WHEEL_FAILED[@]} -gt 0 ]; then    warn \"\u041f\u0430\u043a\u0435\u0442\u044b \u0431\u0435\u0437 wheel: ${WHEEL_FAILED[*]}\"    warn \"\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u044e \u0438\u0445 \u043a\u0430\u043a sdist (\u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435):\"    warn \"  - \u043d\u0443\u0436\u0435\u043d gcc (build-essential)\"    warn \"  - \u043d\u0443\u0436\u0435\u043d python3-dev (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 Python)\"    warn \"  - \u0434\u043b\u044f tokenizers \u043d\u0443\u0436\u0435\u043d rustc\/cargo\"    for pkg in \"${WHEEL_FAILED[@]}\"; do        \"$PIP\" download --dest \"$OUT_DIR\" --no-cache-dir \"$pkg\" || \\            warn \"  \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u0430\u0447\u0430\u0442\u044c $pkg\"    donefi# --- 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 ---WHL_COUNT=$(find \"$OUT_DIR\" -maxdepth 1 -type f \\( -name '*.whl' -o -name '*.tar.gz' \\) | wc -l)SIZE=$(du -sh \"$OUT_DIR\" | cut -f1)info \"\u0421\u043a\u0430\u0447\u0430\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: $WHL_COUNT\"info \"\u0420\u0430\u0437\u043c\u0435\u0440 $OUT_DIR: $SIZE\"if [ \"$WHL_COUNT\" -lt \"$PKG_COUNT\" ]; then    warn \"\u0424\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 ($WHL_COUNT &lt; $PKG_COUNT).\"    warn \"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 wheel \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443.\"    warn \"\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435: pip download \u043c\u043e\u0436\u0435\u0442 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 wheel.\"fi# --- 5. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043e\u0444\u043b\u0430\u0439\u043d-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 ---echo \"\"info \"\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435:\"echo \"    python3 -m venv venv\"echo \"    .\/venv\/bin\/pip install --no-index --find-links=$OUT_DIR -r $REQ_FILE\"echo \"\"info \"\u0413\u043e\u0442\u043e\u0432\u043e.\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b<\/h4>\n<h3>requirements.lock \u2014 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439<\/h3>\n<pre><code class=\"bash\">pip freeze &gt; requirements.lock<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e <strong>\u0441\u043d\u0438\u043c\u043e\u043a<\/strong> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <code>venv<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 <code>open-webui<\/code> \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <code>make_offline_<\/code><a href=\"http:\/\/packages.sh\" rel=\"noopener nofollow\"><code>packages.sh<\/code><\/a>, <code>requirements.lock<\/code> \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u0430 <code>offline_packages\/<\/code> \u2014 \u043d\u043e\u0432\u044b\u043c\u0438 wheels. \u0421\u0442\u0430\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f (\u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f), \u043d\u043e <code>pip install --no-index<\/code> \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u0442\u0435, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>requirements.lock<\/code>.<\/p>\n<p><strong>\u0414\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/strong> \u0445\u0440\u0430\u043d\u0438\u0442\u0435 <code>requirements.lock<\/code> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c (\u043e\u043d \u0432 git\/\u0430\u0440\u0445\u0438\u0432\u0435) \u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 <code>make_offline_<\/code><a href=\"http:\/\/packages.sh\" rel=\"noopener nofollow\"><code>packages.sh<\/code><\/a> \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u0420\u0430\u0437\u043c\u0435\u0440 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432<\/h3>\n<p>\u0414\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0442\u0435\u043a\u0430 (<code>open-webui<\/code> + <code>torch<\/code> + <code>llama.cpp<\/code> \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438):<\/p>\n<ul>\n<li>\n<p><strong>~244 \u0444\u0430\u0439\u043b\u0430<\/strong>, <strong>~730 \u041c\u0411<\/strong>.<\/p>\n<\/li>\n<li>\n<p><code><strong>torch-2.11.0+cpu<\/strong><\/code> \u2014 ~200 \u041c\u0411 (\u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439).<\/p>\n<\/li>\n<li>\n<p><code><strong>nvidia-*<\/strong><\/code><strong> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442<\/strong> \u2014 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440, \u0447\u0442\u043e CUDA \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u043b\u0430\u0441\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 <strong>\u0431\u043e\u043b\u044c\u0448\u0435 2 \u0413\u0411<\/strong> \u2014 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043f\u0430\u043b\u0430 CUDA-\u0432\u0435\u0440\u0441\u0438\u044f <code>torch<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430:<\/p>\n<pre><code class=\"bash\">ls offline_packages\/ | grep -i nvidia    # \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043els offline_packages\/torch-*.whl          # \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c +cpu \u0432 \u0438\u043c\u0435\u043d\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u043c<\/h3>\n<p><strong>1. \u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 \u0447\u0438\u0441\u0442\u044b\u0439 <\/strong><code><strong>venv<\/strong><\/code><strong>:<\/strong><\/p>\n<pre><code class=\"bash\">rm -rf \/tmp\/test-offlinepython3 -m venv \/tmp\/test-offline\/tmp\/test-offline\/bin\/pip install \\    --no-index \\    --find-links=.\/offline_packages \\    -r requirements.lock\/tmp\/test-offline\/bin\/python -c \"import torch; print(torch.__version__)\"rm -rf \/tmp\/test-offline<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 <code>2.11.0+cpu<\/code>. \u0415\u0441\u043b\u0438 \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 <code>No matching distribution<\/code> \u2014 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, <code>pip download<\/code> \u0435\u0433\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b (\u0440\u0435\u0434\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441 platform-specific wheels).<\/p>\n<p><strong>2. <\/strong><code><strong>pip check<\/strong><\/code><strong> \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438:<\/strong><\/p>\n<pre><code class=\"bash\">\/tmp\/test-offline\/bin\/pip check<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u2014 <code>requirements.lock<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>fla<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>transformers&gt;=5.6.2<\/code>, \u0430 \u0432 lock \u2014 <code>5.5.4<\/code>). \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u0437 <code>venv<\/code>, <code>pip freeze &gt; requirements.lock<\/code> \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u0443.<\/p>\n<h4>\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441<\/h4>\n<p><strong>1. \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u0443 (\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c):<\/strong><\/p>\n<pre><code class=\"bash\">.\/make_offline_packages.sh<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u044f\u0432\u0438\u0442\u0441\u044f <code>offline_packages\/<\/code> (~730 \u041c\u0411) \u0438 <code>requirements.lock<\/code>.<\/p>\n<p><strong>2. \u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0430\u0440\u0445\u0438\u0432:<\/strong><\/p>\n<pre><code class=\"bash\">cd ..tar czf llama_server_offline.tar.gz \\    --exclude='llama_server\/venv' \\    --exclude='llama_server\/.secrets' \\    --exclude='llama_server\/open-webui-data' \\    llama_server\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u043f\u043e\u0447\u0435\u043c\u0443:<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u0438\u0447\u0438\u043d\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code><strong>venv\/<\/strong><\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u0437 <code>offline_packages\/<\/code>. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c 2\u20133 \u0413\u0411 <code>venv<\/code> \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u2014 \u043e\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043f\u0443\u0442\u044f\u043c \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 Python.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code><strong>.secrets<\/strong><\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u044e\u0447\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u2014 \u0441\u0435\u0441\u0441\u0438\u0438 WebUI \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f, \u043d\u043e \u043a\u043b\u044e\u0447\u0438 \u00ab\u0443\u0435\u0434\u0443\u0442\u00bb \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0447\u0435\u0440\u0435\u0437 <code>init_<\/code><a href=\"http:\/\/secrets.sh\" rel=\"noopener nofollow\"><code>secrets.sh<\/code><\/a>.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code><strong>open-webui-data\/<\/strong><\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0447\u0430\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u00ab\u0447\u0438\u0441\u0442\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435, \u043f\u0443\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0441 \u043d\u0443\u043b\u044f. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0438 <code>.secrets<\/code> \u0442\u043e\u0436\u0435 (\u0438\u043d\u0430\u0447\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u044e\u0442\u0441\u044f).<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0427\u0442\u043e \u041d\u0415 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c:<\/strong><\/p>\n<ul>\n<li>\n<p><code><strong>offline_packages\/<\/strong><\/code> \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>requirements.lock<\/strong><\/code> \u2014 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><code><strong>models\/<\/strong><\/code> \u2014 \u043c\u043e\u0434\u0435\u043b\u0438 (\u0442\u044f\u0436\u0451\u043b\u044b\u0435, \u043d\u043e \u043d\u0443\u0436\u043d\u044b).<\/p>\n<\/li>\n<li>\n<p><code><strong>llama.cpp\/<\/strong><\/code> \u0438 <code><strong>stable-diffusion.cpp\/<\/strong><\/code> \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 + <code>build\/bin\/<\/code> (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0435\u0441\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 CPU \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f).<\/p>\n<\/li>\n<li>\n<p><code><strong>web\/<\/strong><\/code>, <strong>\u0432\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b<\/strong>, <code><strong>README.md<\/strong><\/code>.<\/p>\n<\/li>\n<\/ul>\n<p><strong>3. \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0430\u0440\u0445\u0438\u0432<\/strong> \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 (\u0444\u043b\u0435\u0448\u043a\u0430, scp, rsync \u2014 \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e).<\/p>\n<p><strong>4. \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (Debian 12 x86_64, \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430):<\/strong><\/p>\n<pre><code class=\"bash\">tar xzf llama_server_offline.tar.gzcd llama_server# \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b (\u043d\u0443\u0436\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 apt-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0441\u0442\u043e\u044f\u0442)sudo apt install -y cmake build-essential libopenblas-dev \\    python3 python3-venv python3-pip git curl wget jq# Python-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u043f\u044bpython3 -m venv venv.\/venv\/bin\/pip install --no-index --find-links=.\/offline_packages -r requirements.lock# \u0421\u0435\u043a\u0440\u0435\u0442\u044b (\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e).\/init_secrets.sh# \u0417\u0430\u043f\u0443\u0441\u043a.\/run_webui.sh<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u043e \u0448\u0430\u0433\u0430\u043c:<\/strong><\/p>\n<ul>\n<li>\n<p><code>python3 -m venv venv<\/code> \u2014 \u0431\u044b\u0441\u0442\u0440\u043e, \u0431\u0435\u0437 \u0441\u0435\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><code>pip install --no-index<\/code> \u2014 \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>offline_packages\/<\/code>, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a PyPI. \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0442\u0435 <code>Downloading<\/code> \u2014 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>--no-index<\/code> \u0437\u0430\u0431\u044b\u0442).<\/p>\n<\/li>\n<li>\n<p><code>.\/init_<\/code><a href=\"http:\/\/secrets.sh\" rel=\"noopener nofollow\"><code>secrets.sh<\/code><\/a> \u2014 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 <code>.secrets<\/code> \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><code>.\/run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a> \u2014 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>llama.cpp<\/code>, \u0435\u0441\u043b\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u043d\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438<\/h4>\n<ol>\n<li>\n<p><strong>\u0420\u0430\u0437\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Python.<\/strong> <code>offline_packages\/<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 wheels \u0441 \u0442\u0435\u0433\u043e\u043c <code>cp311<\/code> (Python 3.11, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f Debian 12). \u0415\u0441\u043b\u0438 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 Python 3.12 \u2014 \u0447\u0430\u0441\u0442\u044c wheels \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0442\u0430 \u0436\u0435 \u041e\u0421 \u0438 \u0432\u0435\u0440\u0441\u0438\u044f Python (Debian 12 -&gt; 3.11).<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0437\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430.<\/strong> <code>offline_packages\/<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 wheels \u0434\u043b\u044f <code>x86_64<\/code>. \u041d\u0430 ARM (Raspberry Pi) \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u0443 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p><code><strong>systemd-run<\/strong><\/code><strong> \u0432 LXC\/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.<\/strong> <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>systemd-run --user --scope<\/code> \u0434\u043b\u044f \u043b\u0438\u043c\u0438\u0442\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 LXC\/Docker \u0431\u0435\u0437 user session \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u00ab\u0431\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u0430\u00bb, \u043d\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u044a\u0435\u0441\u0442\u044c \u0432\u0441\u044e RAM. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 (\u043d\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435), \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043b\u0438\u043c\u0438\u0442\u044b \u0432 <code>systemd<\/code> \u044e\u043d\u0438\u0442\u044b (\u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p><code><strong>systemd-run<\/strong><\/code><strong> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <\/strong><code><strong>logind<\/strong><\/code><strong>.<\/strong> \u041d\u0430 headless-\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0431\u0435\u0437 <code>logind<\/code> (\u0438\u043b\u0438 \u0432 SSH-\u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0435\u0437 <code>pam_systemd<\/code>) <code>systemd-run --user<\/code> \u0443\u043f\u0430\u0434\u0451\u0442. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: <code>sudo loginctl enable-linger $USER<\/code>, \u0447\u0442\u043e\u0431\u044b user-\u0441\u0435\u0441\u0441\u0438\u044f \u0436\u0438\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u043b\u043e\u0433\u0430\u0443\u0442\u0430, \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>llama-server<\/code> \u0431\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p><code><strong>open-webui-data\/<\/strong><\/code><strong> \u0438 <\/strong><code><strong>.secrets<\/strong><\/code><strong>.<\/strong> \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u043e\u0431\u0430 \u2014 \u0441\u0435\u0441\u0441\u0438\u0438 WebUI \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (\u043a\u043b\u044e\u0447 \u0442\u043e\u0442 \u0436\u0435). \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e <code>open-webui-data\/<\/code> \u0431\u0435\u0437 <code>.secrets<\/code> \u2014 WebUI \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 <code>WEBUI_SECRET_KEY<\/code>, \u0438 \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u043e\u0433\u0438\u043d\u044f\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>.secrets<\/code> \u0431\u0435\u0437 <code>open-webui-data\/<\/code> \u2014 \u043d\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u043e \u043a\u043b\u044e\u0447\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u044b \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p><strong>\u0427\u0442\u043e \u0434\u0430\u0451\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c: \u0442\u0435 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a PyPI \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0440\u0438\u0441\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0432\u0442\u0440\u0430 <code>open-webui<\/code> \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438 \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0430\u0440\u0445\u0438\u0432\u0430: ~730 \u041c\u0411 (\u0440\u0435\u043f\u0430) + \u043c\u043e\u0434\u0435\u043b\u0438 (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0413\u0411, \u0443 \u043c\u0435\u043d\u044f \u043e\u043a\u043e\u043b\u043e 70 \u0413\u0431) + \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0442\u043e \u041d\u0415 \u0440\u0435\u0448\u0430\u0435\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b (<code>apt<\/code>) \u2014 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 apt-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 <code>apt-offline<\/code>). \u0414\u043b\u044f Debian 12 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 (<code>cmake<\/code>, <code>python3-venv<\/code>, <code>git<\/code>) \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442, \u043d\u043e \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 <code>llama.cpp<\/code>\/<code>stable-diffusion.cpp<\/code> \u2014 \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0432\u0435, \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (\u0435\u0441\u043b\u0438 <code>cmake<\/code>\/<code>gcc<\/code> \u0435\u0441\u0442\u044c).<\/p>\n<\/li>\n<\/ul>\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\/1099552\/\">https:\/\/habr.com\/ru\/articles\/1099552\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430\u041e\u0444\u043b\u0430\u0439\u043d-\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0435\u043a\u0430 \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0435 Python-\u043f\u0430\u043a\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0430\u043d\u044b \u0432 offline_packages\/, \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u043f\u044b. \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u00ab\u0441\u043d\u0438\u043c\u043e\u043a\u00bb \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0435\u043a \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Debian 12.\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 pip install open-webui \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u2014 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043e\u0434\u043d\u0443 \u0432\u0435\u0440\u0441\u0438\u044e, \u0437\u0430\u0432\u0442\u0440\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u0414\u043b\u044f \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u044b \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e: pip \u043b\u0438\u0431\u043e \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 \u00abno internet\u00bb, \u043b\u0438\u0431\u043e (\u0435\u0441\u043b\u0438 \u043a\u044d\u0448 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439) \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430 (offline_packages\/) \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:\u0424\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u2014 requirements.lock \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (transformers==5.5.4, torch==2.11.0+cpu \u0438 \u0442.\u0434.), \u0430 \u043d\u0435 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435\u00bb \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b.\u0420\u0430\u0431\u043e\u0442\u0430 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438 \u2014 \u0432\u0441\u0435 .whl \u043b\u0435\u0436\u0430\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, pip install &#8212;no-index &#8212;find-links=.\/offline_packages \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a PyPI.\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u2014 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u041e\u0421\/Python \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\u0427\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0440\u0435\u043f\u0443: \u0442\u043e\u043b\u044c\u043a\u043e Python-\u043f\u0430\u043a\u0435\u0442\u044b. \u041c\u043e\u0434\u0435\u043b\u0438, \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 llama.cpp\/stable-diffusion.cpp, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, HTML \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0447\u0435\u0440\u0435\u0437 tar \u0432\u0441\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430). offline_packages\/ \u2014 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0430 \u00ab\u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\u00bb.\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 make_offline_packages.sh\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043d\u0438\u043c\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e venv \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 offline_packages\/:pip freeze &gt; requirements.lock \u2014 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0432 venv.pip download -r requirements.lock \u2014 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 wheels \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.&#8212;only-binary=:all: \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0447\u0430\u044e\u0442\u0441\u044f .tar.gz (sdist). \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435\u0442 wheel \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441, \u0430 \u043d\u0435 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435.&#8212;extra-index-url https:\/\/download.pytorch.org\/whl\/cpu \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: torch \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0441 CPU-\u0438\u043d\u0434\u0435\u043a\u0441\u0430 (\u0432\u0435\u0440\u0441\u0438\u044f +cpu), \u0430 \u043d\u0435 \u0441 PyPI (CUDA-\u0432\u0435\u0440\u0441\u0438\u044f \u0441 nvidia-*).Fallback \u043d\u0430 sdist \u2014 \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 wheel \u043d\u0435\u0442, \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043a\u0430\u0447\u0430\u0435\u0442 .tar.gz \u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442, \u0447\u0442\u043e \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f gcc, python3-dev, \u0430 \u0434\u043b\u044f tokenizers \u2014 rustc\/cargo.\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 requirements.lock. \u0415\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0435\u0442.\u041f\u043e\u0447\u0435\u043c\u0443 &#8212;extra-index-url, \u0430 \u043d\u0435 &#8212;index-url. \u0421 &#8212;index-url pip \u0438\u0449\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 PyTorch-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 open-webui (\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435\u0442). \u0421 &#8212;extra-index-url \u2014 \u0438\u0449\u0435\u0442 \u0432\u0435\u0437\u0434\u0435: open-webui \u043d\u0430 PyPI, torch \u043d\u0430 PyTorch-\u0438\u043d\u0434\u0435\u043a\u0441\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c torch==2.11.0+cpu (\u0441\u0443\u0444\u0444\u0438\u043a\u0441 +cpu) \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 CPU-\u0432\u0435\u0440\u0441\u0438\u044e, \u0438 CUDA \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u043d\u0435\u0442\u0441\u044f.\u041f\u0440\u043e \u00abno wheel\u00bb fallback. \u0412 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430 open-webui + torch \u043d\u0430 Debian 12 x86_64 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 wheels. Fallback \u043d\u0443\u0436\u0435\u043d \u043a\u0430\u043a \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0430: \u043b\u0443\u0447\u0448\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e sdist \u0441\u0435\u0439\u0447\u0430\u0441 (\u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c python3-dev), \u0447\u0435\u043c \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c error: command &#8216;gcc&#8217; failed.\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 make_offline_packages.sh#!\/usr\/bin\/env bash# \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e venv \u0432 offline_packages\/.# \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043f\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0443.## Usage: .\/make_offline_packages.sh# Env:#   VENV_DIR=.\/venv          \u043f\u0443\u0442\u044c \u043a venv (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)#   OUT_DIR=.\/offline_packages  \u043a\u0443\u0434\u0430 \u043a\u0430\u0447\u0430\u0442\u044c#   PIP_EXTRA_INDEX_URL      \u0434\u043b\u044f CPU-torch (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e PyTorch CPU)set -euo pipefailSCRIPT_DIR=&#187;$(cd &#171;$(dirname &#171;${BASH_SOURCE[0]}&#187;)&#187; &amp;&amp; pwd)&#187;VENV_DIR=&#187;${VENV_DIR:-$SCRIPT_DIR\/venv}&#187;OUT_DIR=&#187;${OUT_DIR:-$SCRIPT_DIR\/offline_packages}&#187;REQ_FILE=&#187;$SCRIPT_DIR\/requirements.lock&#187;TORCH_INDEX=&#187;${PIP_EXTRA_INDEX_URL:-https:\/\/download.pytorch.org\/whl\/cpu}&#187;RED=&#8217;\\033[0;31m&#8217;; GREEN=&#8217;\\033[0;32m&#8217;; YELLOW=&#8217;\\033[1;33m&#8217;; NC=&#8217;\\033[0m&#8217;info()  { echo -e &#171;${GREEN}[INFO]${NC}  $*&#187;; }warn()  { echo -e &#171;${YELLOW}[WARN]${NC}  $*&#187;; }error() { echo -e &#171;${RED}[ERROR]${NC} $*&#187; &gt;&amp;2; exit 1; }[ -d &#171;$VENV_DIR&#187; ] || error &#171;venv \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d: $VENV_DIR&#187;PIP=&#187;$VENV_DIR\/bin\/pip&#187;[ -x &#171;$PIP&#187; ] || error &#171;pip \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d: $PIP&#187;mkdir -p &#171;$OUT_DIR&#187;# &#8212; 1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 &#8212;info &#171;\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e $REQ_FILE \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#8230;&#187;&#187;$PIP&#187; freeze &gt; &#171;$REQ_FILE&#187;PKG_COUNT=$(wc -l &lt; &#171;$REQ_FILE&#187;)info &#171;\u041f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435: $PKG_COUNT&#187;# &#8212; 2. \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0451, \u043a\u0440\u043e\u043c\u0435 torch (\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e wheels) &#8212;info &#171;\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u044e \u043f\u0430\u043a\u0435\u0442\u044b \u0432 $OUT_DIR (wheels)&#8230;&#187;#grep -v -i &#8216;^torch&#8217; &#171;$REQ_FILE&#187; &gt; &#171;$REQ_FILE.tmp&#187; || trueWHEEL_FAILED=()if [ -s &#171;$REQ_FILE&#187; ]; then    if ! &#171;$PIP&#187; download \\            &#8212;dest &#171;$OUT_DIR&#187; \\            &#8212;only-binary=:all: \\            &#8212;no-cache-dir \\            &#8212;extra-index-url &#171;$TORCH_INDEX&#187; \\            -r &#171;$REQ_FILE&#187;; then        warn &#171;\u041d\u0435 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u043c\u0435\u044e\u0442 wheel. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u043e\u0432&#8230;&#187;        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0442\u0435, \u0443 \u043a\u043e\u0433\u043e \u043d\u0435\u0442 wheel        while IFS= read -r pkg; do            [ -z &#171;$pkg&#187; ] &amp;&amp; continue            if ! &#171;$PIP&#187; download \\                    &#8212;dest &#171;$OUT_DIR&#187; \\                    &#8212;only-binary=:all: \\                    &#8212;no-cache-dir \\                    &#171;$pkg&#187; &gt;\/dev\/null 2&gt;&amp;1; then                WHEEL_FAILED+=(&#171;$pkg&#187;)            fi        done &lt; &#171;$REQ_FILE&#187;    fielse    warn &#171;\u0421\u043f\u0438\u0441\u043e\u043a \u0431\u0435\u0437 torch \u043f\u0443\u0441\u0442, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e&#187;firm -f &#171;$REQ_FILE.tmp&#187;# &#8212; 2b. Fallback: sdist \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0431\u0435\u0437 wheel &#8212;if [ ${#WHEEL_FAILED[@]} -gt 0 ]; then    warn &#171;\u041f\u0430\u043a\u0435\u0442\u044b \u0431\u0435\u0437 wheel: ${WHEEL_FAILED[*]}&#187;    warn &#171;\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u044e \u0438\u0445 \u043a\u0430\u043a sdist (\u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435):&#187;    warn &#187;  &#8212; \u043d\u0443\u0436\u0435\u043d gcc (build-essential)&#187;    warn &#187;  &#8212; \u043d\u0443\u0436\u0435\u043d python3-dev (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 Python)&#187;    warn &#187;  &#8212; \u0434\u043b\u044f tokenizers \u043d\u0443\u0436\u0435\u043d rustc\/cargo&#187;    for pkg in &#171;${WHEEL_FAILED[@]}&#187;; do        &#171;$PIP&#187; download &#8212;dest &#171;$OUT_DIR&#187; &#8212;no-cache-dir &#171;$pkg&#187; || \\            warn &#187;  \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u0430\u0447\u0430\u0442\u044c $pkg&#187;    donefi# &#8212; 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 &#8212;WHL_COUNT=$(find &#171;$OUT_DIR&#187; -maxdepth 1 -type f \\( -name &#8216;*.whl&#8217; -o -name &#8216;*.tar.gz&#8217; \\) | wc -l)SIZE=$(du -sh &#171;$OUT_DIR&#187; | cut -f1)info &#171;\u0421\u043a\u0430\u0447\u0430\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: $WHL_COUNT&#187;info &#171;\u0420\u0430\u0437\u043c\u0435\u0440 $OUT_DIR: $SIZE&#187;if [ &#171;$WHL_COUNT&#187; -lt &#171;$PKG_COUNT&#187; ]; then    warn &#171;\u0424\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 ($WHL_COUNT &lt; $PKG_COUNT).&#187;    warn &#171;\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 wheel \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443.&#187;    warn &#171;\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435: pip download \u043c\u043e\u0436\u0435\u0442 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 wheel.&#187;fi# &#8212; 5. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043e\u0444\u043b\u0430\u0439\u043d-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 &#8212;echo &#171;&#187;info &#171;\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u043e\u0444\u043b\u0430\u0439\u043d-\u043c\u0430\u0448\u0438\u043d\u0435:&#187;echo &#187;    python3 -m venv venv&#187;echo &#187;    .\/venv\/bin\/pip install &#8212;no-index &#8212;find-links=$OUT_DIR -r $REQ_FILE&#187;echo &#171;&#187;info &#171;\u0413\u043e\u0442\u043e\u0432\u043e.&#187;\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044brequirements.lock \u2014 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439pip freeze &gt; requirements.lock\u042d\u0442\u043e \u0441\u043d\u0438\u043c\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e venv. \u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 open-webui \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 make_offline_packages.sh, requirements.lock \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u0430 offline_packages\/ \u2014 \u043d\u043e\u0432\u044b\u043c\u0438 wheels. \u0421\u0442\u0430\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f (\u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f), \u043d\u043e pip install &#8212;no-index \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u0442\u0435, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 requirements.lock.\u0414\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0435 requirements.lock \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c (\u043e\u043d \u0432 git\/\u0430\u0440\u0445\u0438\u0432\u0435) \u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 make_offline_packages.sh \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.\u0420\u0430\u0437\u043c\u0435\u0440 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u0414\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0442\u0435\u043a\u0430 (open-webui + torch + llama.cpp \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438):~244 \u0444\u0430\u0439\u043b\u0430, ~730 \u041c\u0411.torch-2.11.0+cpu \u2014 ~200 \u041c\u0411 (\u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439).nvidia-* \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u2014 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440, \u0447\u0442\u043e CUDA \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u043b\u0430\u0441\u044c.\u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0435 2 \u0413\u0411 \u2014 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043f\u0430\u043b\u0430 CUDA-\u0432\u0435\u0440\u0441\u0438\u044f torch. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430:ls offline_packages\/ | grep -i nvidia    # \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043els offline_packages\/torch-*.whl          # \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c +cpu \u0432 \u0438\u043c\u0435\u043d\u0438\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u043c1. \u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 \u0447\u0438\u0441\u0442\u044b\u0439 venv:rm -rf \/tmp\/test-offlinepython3 -m venv \/tmp\/test-offline\/tmp\/test-offline\/bin\/pip install \\    &#8212;no-index \\    &#8212;find-links=.\/offline_packages \\    -r requirements.lock\/tmp\/test-offline\/bin\/python -c &#171;import torch; print(torch.__version__)&#187;rm -rf \/tmp\/test-offline\u0414\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 2.11.0+cpu. \u0415\u0441\u043b\u0438 \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 No matching distribution \u2014 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, pip download \u0435\u0433\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b (\u0440\u0435\u0434\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441 platform-specific wheels).2. pip check \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438:\/tmp\/test-offline\/bin\/pip check\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u2014 requirements.lock \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, fla \u0442\u0440\u0435\u0431\u0443\u0435\u0442 transformers&gt;=5.6.2, \u0430 \u0432 lock \u2014 5.5.4). \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u0437 venv, pip freeze &gt; requirements.lock \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u0443.\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u04411. \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u0443 (\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c):.\/make_offline_packages.sh\u041f\u043e\u044f\u0432\u0438\u0442\u0441\u044f offline_packages\/ (~730 \u041c\u0411) \u0438 requirements.lock.2. \u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0430\u0440\u0445\u0438\u0432:cd ..tar czf llama_server_offline.tar.gz \\    &#8212;exclude=&#8217;llama_server\/venv&#8217; \\    &#8212;exclude=&#8217;llama_server\/.secrets&#8217; \\    &#8212;exclude=&#8217;llama_server\/open-webui-data&#8217; \\    llama_server\/\u0427\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u043f\u043e\u0447\u0435\u043c\u0443:\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u041f\u0440\u0438\u0447\u0438\u043d\u0430venv\/\u041f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u0437 offline_packages\/. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c 2\u20133 \u0413\u0411 venv \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u2014 \u043e\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043f\u0443\u0442\u044f\u043c \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 Python..secrets\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u044e\u0447\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u2014 \u0441\u0435\u0441\u0441\u0438\u0438 WebUI \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f, \u043d\u043e \u043a\u043b\u044e\u0447\u0438 \u00ab\u0443\u0435\u0434\u0443\u0442\u00bb \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0447\u0435\u0440\u0435\u0437 init_secrets.sh.open-webui-data\/\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0447\u0430\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u00ab\u0447\u0438\u0441\u0442\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435, \u043f\u0443\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0441 \u043d\u0443\u043b\u044f. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0438 .secrets \u0442\u043e\u0436\u0435 (\u0438\u043d\u0430\u0447\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u044e\u0442\u0441\u044f).\u0427\u0442\u043e \u041d\u0415 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c:offline_packages\/ \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u0430.requirements.lock \u2014 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439.models\/ \u2014 \u043c\u043e\u0434\u0435\u043b\u0438 (\u0442\u044f\u0436\u0451\u043b\u044b\u0435, \u043d\u043e \u043d\u0443\u0436\u043d\u044b).llama.cpp\/ \u0438 stable-diffusion.cpp\/ \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 + build\/bin\/ (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0435\u0441\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 CPU \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f).web\/, \u0432\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, README.md.3. \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0430\u0440\u0445\u0438\u0432 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 (\u0444\u043b\u0435\u0448\u043a\u0430, scp, rsync \u2014 \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e).4. \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (Debian 12 x86_64, \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430):tar xzf llama_server_offline.tar.gzcd llama_server# \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b (\u043d\u0443\u0436\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 apt-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0441\u0442\u043e\u044f\u0442)sudo apt install -y cmake build-essential libopenblas-dev \\    python3 python3-venv python3-pip git curl wget jq# Python-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u043f\u044bpython3 -m venv venv.\/venv\/bin\/pip install &#8212;no-index &#8212;find-links=.\/offline_packages -r requirements.lock# \u0421\u0435\u043a\u0440\u0435\u0442\u044b (\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e).\/init_secrets.sh# \u0417\u0430\u043f\u0443\u0441\u043a.\/run_webui.sh\u041f\u043e \u0448\u0430\u0433\u0430\u043c:python3 -m venv venv \u2014 \u0431\u044b\u0441\u0442\u0440\u043e, \u0431\u0435\u0437 \u0441\u0435\u0442\u0438.pip install &#8212;no-index \u2014 \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e offline_packages\/, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a PyPI. \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0442\u0435 Downloading \u2014 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#8212;no-index \u0437\u0430\u0431\u044b\u0442)..\/init_secrets.sh \u2014 \u0441\u043e\u0437\u0434\u0430\u0441\u0442&#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-500333","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500333","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=500333"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500333\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}