{"id":477700,"date":"2026-04-28T07:11:20","date_gmt":"2026-04-28T07:11:20","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=477700"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=477700","title":{"rendered":"\u0424\u0440\u0430\u043d\u043a\u0435\u043d\u0448\u0442\u0435\u0439\u043d \u043d\u0430 30 \u0413\u0411 RAM: \u041a\u0430\u043a \u043c\u044b \u043f\u0435\u0440\u0435\u0441\u0430\u0434\u0438\u043b\u0438 \u043c\u043e\u0437\u0433 Gemma \u0432 \u0441\u043a\u0435\u043b\u0435\u0442 DeepSeek \u0438 \u0441\u043b\u043e\u043c\u0430\u043b\u0438 Transformers"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> \u0423 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0434\u0432\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b T4 \u0432 Kaggle, 30 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0431\u0435\u0437\u0443\u043c\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0432\u0435\u0441\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 (Gemma-4-31B) \u0438 \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432\u0448\u0438\u0442\u044c \u0438\u0445 \u0432 MoE-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 (DeepSeek-V4)?  <\/p>\n<p>\u0412 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u0430\u043c \u0441\u043a\u0430\u0436\u0443\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e: \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u043b\u043e\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041d\u043e \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 <strong>Ghetto MLOps<\/strong> \u043d\u0435\u0442 \u0441\u043b\u043e\u0432\u0430 \u00ab\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00bb. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441: <em>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c?<\/em><\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c \u0440\u0435\u0435\u0441\u0442\u0440 Hugging Face, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 PyTorch \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>transformers<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0418\u0418-\u043c\u0443\u0442\u0430\u043d\u0442\u0430.<\/p>\n<h3>\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/h3>\n<p>\u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u043c \u0441\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0438 (Grafting).<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u043e\u043d\u043e\u0440 (\u041f\u043b\u043e\u0442\u044c):<\/strong> 4 \u0441\u043b\u043e\u044f \u043e\u0442 31-\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 <code>Gemma<\/code> (\u0441\u0436\u0430\u0442\u043e\u0439 \u0434\u043e 4-\u0431\u0438\u0442 NF4).<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442:<\/strong> \u041f\u0443\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 <code>DeepSeek-V4<\/code> \u0441 \u0435\u0451 \u0445\u0438\u0442\u0440\u044b\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c Mixture-of-Experts (MoE).<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e: \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0431\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0446\u0438\u043a\u043b\u043e\u043c <code>for<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0441\u043b\u043e\u044f\u043c, \u0434\u0435\u043b\u0430\u0435\u043c <code>.copy_()<\/code> \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>transformers<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043d\u0430\u043c \u043e\u0436\u0435\u0441\u0442\u043e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u0441 \u0447\u0435\u043c \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043b\u0435\u0447\u0438\u043b\u0438.<\/p>\n<h4>\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 1: Identity Theft \u0438 \u043f\u0430\u0440\u0430\u043d\u043e\u0439\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432<\/h4>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0438\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0438 <code>gemma4<\/code>. \u041c\u044b \u043e\u0431\u043e\u0448\u043b\u0438 \u044d\u0442\u043e, \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u0442\u0438\u043f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>CONFIG_MAPPING<\/code>.<\/p>\n<p>\u041d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043c\u0438\u0441\u0442\u0438\u043a\u0430. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, <code>transformers<\/code> \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443: <code>AttributeError: 'dict' object has no attribute 'to_dict'<\/code>.<\/p>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f <code>generation<\/code> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (<code>dict<\/code>), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0430\u043c\u0430 \u0436\u0435 \u043f\u0430\u0434\u0430\u0435\u0442, \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 (Monkey-patching):<\/strong> \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u00ab\u0431\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u043f\u0430\u0442\u0447\u00bb. \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 <code>AttributeError<\/code>, \u043c\u044b \u043d\u0430 \u043b\u0435\u0442\u0443 \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 <code>Proxy-\u043a\u043b\u0430\u0441\u0441<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h4>\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 2: \u041a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442 DeepSeek \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 4 \u0441\u043b\u043e\u0435\u0432 \u0413\u0435\u043c\u043c\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u0448\u0438\u043b\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0448\u0443\u043c\u043e\u043c, \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 <code>normal_<\/code> (\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435).<\/p>\n<p>\u0418 \u0442\u0443\u0442 PyTorch \u0432\u043f\u0430\u043b \u0432 \u043a\u043e\u043c\u0443: <code>NotImplementedError: \"normal_kernel_cuda\" not implemented for 'Byte'<\/code>.<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0435\u0441\u0430 \u0434\u043e\u043d\u043e\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 <code>bitsandbytes<\/code> \u0432 4-\u0431\u0438\u0442\u0430\u0445 (\u043a\u0430\u043a \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b <code>uint8<\/code>). \u0410 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0443\u043c\u0430 PyTorch \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (float).<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> \u041c\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 <code>TORCH_INIT_FUNCTIONS[\"normal_\"]<\/code> \u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043b\u0438 \u0435\u0439 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0442\u0435\u043d\u0437\u043e\u0440\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u0436\u0430\u0442\u044b \u0432 \u0431\u0430\u0439\u0442\u044b.<\/p>\n<h4>\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 3: \u0421\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u044b \u0438 OOM<\/h4>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u044b DeepSeek \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u0442\u0435\u0439\u043d\u0438\u043a\u0430\u043c\u0438: \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 MoE-\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>ModuleList<\/code>, \u0430 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0438\u0445 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>DeepseekV2Experts<\/code>. \u041f\u0438\u0442\u043e\u043d \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u043d\u0435\u043c\u0443 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c 31B-\u0441\u043b\u043e\u0439 \u0413\u0435\u043c\u043c\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0432\u0435\u0441\u043e\u0432, \u043c\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043b\u043e\u0432\u0438\u043b\u0438 <code>Out Of Memory<\/code> (OOM) \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 Kaggle.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> 1. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u00ab\u0443\u043c\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440\u00bb \u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u044b\u0440\u044f\u0435\u0442 \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u0449\u0435\u0442 \u0441\u043b\u043e\u0438 \u043f\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 <code>gate_proj<\/code> \u0438 <code>up_proj<\/code>.<\/p>\n<p>2. \u0414\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 OOM \u043c\u044b \u0440\u0430\u0437\u043d\u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c GPU, \u0430 \u0432\u0435\u0441\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u0438 \u043c\u0438\u043a\u0440\u043e-\u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 CPU, \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044f <code>gc.collect()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043e\u0447\u0438\u0449\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0443.<\/p>\n<h3>\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0435\u043a\u0440\u043e\u043c\u0430\u043d\u0442\u0430<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043c\u044b \u0432\u044b\u043a\u043e\u0432\u0430\u043b\u0438 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0437\u0430\u0449\u0438\u0442\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043f\u043b\u0430\u043d\u0442\u0430\u0446\u0438\u044e. \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<p>Python<\/p>\n<pre><code>import torchimport osimport gcimport transformers.generation.configuration_utils as gen_utilsfrom transformers import (    AutoConfig, AutoModelForCausalLM, AutoTokenizer,     BitsAndBytesConfig, GemmaConfig, CONFIG_MAPPING, GenerationConfig)from transformers.initialization import TORCH_INIT_FUNCTIONS# --- 1. \u041e\u0427\u0418\u0421\u0422\u041a\u0410 \u041f\u0410\u041c\u042f\u0422\u0418 ---def cleanup():    gc.collect()    torch.cuda.empty_cache()cleanup()# --- 2. \u042f\u0414\u0415\u0420\u041d\u042b\u0415 \u041f\u0410\u0422\u0427\u0418 (\u041e\u0431\u0445\u043e\u0434 \u0437\u0430\u0449\u0438\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438) ---print(\"\ud83d\udee0 \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0430\u0442\u0447\u0435\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438...\")# \u041f\u0430\u0442\u0447 2.1: \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0433\u0430 \u0441 dict.to_dict()original_from_model_config = GenerationConfig.from_model_config@classmethoddef patched_from_model_config(cls, model_config):    try: return original_from_model_config(model_config)    except AttributeError:        class ForcedConfig:            def __init__(self, d): self.d = d if isinstance(d, dict) else {}            def to_dict(self): return self.d            def get_text_config(self, *args, **kwargs): return self            def __getattr__(self, name): return self.d.get(name, None)        return original_from_model_config(ForcedConfig(model_config))gen_utils.GenerationConfig.from_model_config = patched_from_model_config# \u041f\u0430\u0442\u0447 2.2: \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f 4-bit \u0432\u0435\u0441\u043e\u0432original_normal = TORCH_INIT_FUNCTIONS[\"normal_\"]def safe_normal_(tensor, mean=0.0, std=1.0, generator=None):    if tensor.dtype in [torch.uint8, torch.int8]: return tensor    return original_normal(tensor, mean=mean, std=std, generator=generator)TORCH_INIT_FUNCTIONS[\"normal_\"] = safe_normal_# --- 3. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0418 \u0418 \u0420\u0415\u0413\u0418\u0421\u0422\u0420\u0410\u0426\u0418\u042f ---SKELETON_ID = \"livadies\/DeepSeek-V4-Pro-Ghetto-MoE-2-Experts\"DONOR_ID = \"livadies\/gemma-4-31B-Base-Ghetto-NF4\"CONFIG_MAPPING.register(\"gemma4\", GemmaConfig, exist_ok=True)# --- 4. \u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 \u0414\u041e\u041d\u041e\u0420\u0410 (GPU 1) ---print(\"\ud83d\udce1 \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0434\u043e\u043d\u043e\u0440\u0430 \u043d\u0430 GPU 1...\")bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, bnb_4bit_quant_type=\"nf4\")donor = AutoModelForCausalLM.from_pretrained(    DONOR_ID, quantization_config=bnb_config, device_map={\"\": 1},     low_cpu_mem_usage=True, trust_remote_code=True)# --- 5. \u0421\u041a\u0415\u041b\u0415\u0422 (CPU) ---print(\"\ud83d\udce1 \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442 \u043d\u0430 CPU...\")config_v4 = AutoConfig.from_pretrained(SKELETON_ID, trust_remote_code=True)with torch.device(\"cpu\"):    model_v4 = AutoModelForCausalLM.from_config(config_v4, trust_remote_code=True).half()# --- 6. \u0425\u0418\u0420\u0423\u0420\u0413\u0418\u042f (\u0423\u043c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043b\u0430\u043d\u0442\u0430\u0446\u0438\u044f \u0441 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0435\u0439 RAM) ---def adapt_weight(donor_w, target_shape):    \"\"\"\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0443\u043b\u044f\u043c\u0438\"\"\"    with torch.no_grad():        d_tensor = donor_w.to(device=\"cpu\", dtype=torch.float16)        new_w = torch.zeros(target_shape, dtype=torch.float16, device=\"cpu\")        h, w = min(d_tensor.shape[0], target_shape[0]), min(d_tensor.shape[1], target_shape[1])        new_w[:h, :w] = d_tensor[:h, :w].clone()        return new_wdef find_experts(node):    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 DeepseekV2Experts\"\"\"    found = []    if hasattr(node, 'gate_proj') and hasattr(node, 'up_proj') and hasattr(node, 'down_proj'):        found.append(node)    elif isinstance(node, (torch.nn.ModuleList, list, tuple)):        for child in node: found.extend(find_experts(child))    elif hasattr(node, 'children'):        for child in node.children(): found.extend(find_experts(child))    return foundprint(\"\ud83d\udc89 \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0443 \u0432\u0435\u0441\u043e\u0432...\")d_model = donor.model if hasattr(donor, 'model') else donord_layers = getattr(d_model, 'layers', getattr(d_model, 'h', getattr(d_model, 'blocks', None)))with torch.no_grad():    for i in range(4): # \u041f\u0435\u0440\u0435\u0441\u0430\u0436\u0438\u0432\u0430\u0435\u043c 4 \u0441\u043b\u043e\u044f        print(f\"\ud83e\uddec \u0421\u043b\u043e\u0439 {i}: \u0421\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b...\")        dl, vl = d_layers[i], model_v4.model.layers[i]        d_mlp = getattr(dl, 'mlp', getattr(dl, 'ffn', None))                # \u041f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0430 MLP-\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432        if d_mlp:            experts = find_experts(vl.mlp)            for expert in experts:                expert.gate_proj.weight.copy_(adapt_weight(d_mlp.gate_proj.weight, expert.gate_proj.weight.shape))                expert.up_proj.weight.copy_(adapt_weight(d_mlp.up_proj.weight, expert.up_proj.weight.shape))                expert.down_proj.weight.copy_(adapt_weight(d_mlp.down_proj.weight, expert.down_proj.weight.shape))                cleanup() # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b!                # \u041f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0430 Attention        vl.self_attn.q_b_proj.weight.copy_(adapt_weight(dl.self_attn.q_proj.weight, vl.self_attn.q_b_proj.weight.shape))        vl.self_attn.o_proj.weight.copy_(adapt_weight(dl.self_attn.o_proj.weight, vl.self_attn.o_proj.weight.shape))        cleanup()# --- 7. \u0423\u0422\u0418\u041b\u0418\u0417\u0410\u0426\u0418\u042f \u0418 \u0417\u0410\u041f\u0423\u0421\u041a ---print(\"\ud83d\uddd1 \u0421\u0436\u0438\u0433\u0430\u0435\u043c \u0434\u043e\u043d\u043e\u0440\u0430 \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f VRAM...\")del donorcleanup()print(\"\ud83d\ude80 \u041e\u0436\u0438\u0432\u043b\u044f\u0435\u043c \u0425\u0438\u043c\u0435\u0440\u0443 \u043d\u0430 GPU 0...\")model_v4 = model_v4.to(\"cuda:0\")# \u041f\u0430\u0442\u0447 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0435def ghetto_route_final(self, logits):    w = torch.nn.functional.softmax(logits.view(-1, logits.shape[-1]) + 1e-6, dim=-1)    tw, ti = torch.topk(w, k=self.top_k, dim=-1)    return ti, tw * self.routed_scaling_factorfor layer in model_v4.model.layers:    if hasattr(layer, 'mlp') and hasattr(layer.mlp, 'route_tokens_to_experts'):        layer.mlp.route_tokens_to_experts = ghetto_route_final.__get__(layer.mlp)print(\"\u2728 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044f \u0425\u0438\u043c\u0435\u0440\u044b...\")tok = AutoTokenizer.from_pretrained(\"deepseek-ai\/DeepSeek-V2\", trust_remote_code=True)inputs = tok(\"The experimental hybrid AI said:\", return_tensors=\"pt\").to(\"cuda:0\")with torch.no_grad():    outputs = model_v4.generate(**inputs, max_new_tokens=40, do_sample=True, temperature=0.85)print(\"\\n\" + \"=\"*40 + f\"\\n\ud83d\udcdf \u041e\u0422\u0412\u0415\u0422:\\n{tok.decode(outputs[0], skip_special_tokens=True)}\\n\" + \"=\"*40)<\/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<h3>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435?<\/h3>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u0435\u0437 Fine-Tuning&#8217;\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 (Vocab Size) \u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u043e\u0434\u0435\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u0442\u0443\u044e \u00ab\u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u0448\u0438\u0437\u043e\u0444\u0440\u0435\u043d\u0438\u044e\u00bb:<\/p>\n<blockquote>\n<p><code>TheexperimentalhybridAIsaid:vdotsD...Buddhist...tomatosupervised...<\/code><\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0441\u0443\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c ChatGPT \u0437\u0430 \u043d\u043e\u043b\u044c \u0440\u0443\u0431\u043b\u0435\u0439. \u0421\u0443\u0442\u044c \u0432 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438: <strong>\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0435\u043d \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/strong>. \u0418\u043c\u0435\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432, Python \u0438 \u0433\u043e\u0440\u0441\u0442\u044c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 Kaggle.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439-\u043c\u0430\u0432\u0437\u043e\u043b\u0435\u0439 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0425\u0438\u043c\u0435\u0440\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 Hugging Face: <a href=\"https:\/\/www.google.com\/search?q=https:\/\/huggingface.co\/livadies\/DeepGemma-V4-Chimera-Ghetto-MoE\" rel=\"noopener noreferrer nofollow\">livadies\/DeepGemma-V4-Chimera-Ghetto-MoE<\/a><\/p>\n<p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 Ghetto MLOps. \u041b\u043e\u043c\u0430\u0439\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c!<\/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\/1028910\/\">https:\/\/habr.com\/ru\/articles\/1028910\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p> \u0423 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0434\u0432\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b T4 \u0432 Kaggle, 30 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0431\u0435\u0437\u0443\u043c\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0432\u0435\u0441\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 (Gemma-4-31B) \u0438 \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432\u0448\u0438\u0442\u044c \u0438\u0445 \u0432 MoE-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 (DeepSeek-V4)?  \u0412 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u0430\u043c \u0441\u043a\u0430\u0436\u0443\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e: \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u043b\u043e\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041d\u043e \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 Ghetto MLOps \u043d\u0435\u0442 \u0441\u043b\u043e\u0432\u0430 \u00ab\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00bb. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c?\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c \u0440\u0435\u0435\u0441\u0442\u0440 Hugging Face, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 PyTorch \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 transformers \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0418\u0418-\u043c\u0443\u0442\u0430\u043d\u0442\u0430.\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u043c \u0441\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0438 (Grafting).\u0414\u043e\u043d\u043e\u0440 (\u041f\u043b\u043e\u0442\u044c): 4 \u0441\u043b\u043e\u044f \u043e\u0442 31-\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Gemma (\u0441\u0436\u0430\u0442\u043e\u0439 \u0434\u043e 4-\u0431\u0438\u0442 NF4).\u042d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442: \u041f\u0443\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 DeepSeek-V4 \u0441 \u0435\u0451 \u0445\u0438\u0442\u0440\u044b\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c Mixture-of-Experts (MoE).\u0417\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e: \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0431\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0446\u0438\u043a\u043b\u043e\u043c for \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0441\u043b\u043e\u044f\u043c, \u0434\u0435\u043b\u0430\u0435\u043c .copy_() \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 transformers \u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043d\u0430\u043c \u043e\u0436\u0435\u0441\u0442\u043e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u0435.\u0412\u043e\u0442 \u0441 \u0447\u0435\u043c \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043b\u0435\u0447\u0438\u043b\u0438.\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 1: Identity Theft \u0438 \u043f\u0430\u0440\u0430\u043d\u043e\u0439\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0438\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0438 gemma4. \u041c\u044b \u043e\u0431\u043e\u0448\u043b\u0438 \u044d\u0442\u043e, \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u0442\u0438\u043f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435 CONFIG_MAPPING.\u041d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043c\u0438\u0441\u0442\u0438\u043a\u0430. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, transformers \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443: AttributeError: &#8216;dict&#8217; object has no attribute &#8216;to_dict&#8217;.\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f generation \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c (dict), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0430\u043c\u0430 \u0436\u0435 \u043f\u0430\u0434\u0430\u0435\u0442, \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 (Monkey-patching): \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u00ab\u0431\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u043f\u0430\u0442\u0447\u00bb. \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 AttributeError, \u043c\u044b \u043d\u0430 \u043b\u0435\u0442\u0443 \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 Proxy-\u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 2: \u041a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442 DeepSeek \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 4 \u0441\u043b\u043e\u0435\u0432 \u0413\u0435\u043c\u043c\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u0448\u0438\u043b\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0448\u0443\u043c\u043e\u043c, \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 normal_ (\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435).\u0418 \u0442\u0443\u0442 PyTorch \u0432\u043f\u0430\u043b \u0432 \u043a\u043e\u043c\u0443: NotImplementedError: &#171;normal_kernel_cuda&#187; not implemented for &#8216;Byte&#8217;.\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0435\u0441\u0430 \u0434\u043e\u043d\u043e\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 bitsandbytes \u0432 4-\u0431\u0438\u0442\u0430\u0445 (\u043a\u0430\u043a \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b uint8). \u0410 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0443\u043c\u0430 PyTorch \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (float).\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u041c\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 TORCH_INIT_FUNCTIONS[&#171;normal_&#187;] \u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043b\u0438 \u0435\u0439 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0442\u0435\u043d\u0437\u043e\u0440\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u0436\u0430\u0442\u044b \u0432 \u0431\u0430\u0439\u0442\u044b.\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 3: \u0421\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u044b \u0438 OOM\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u044b DeepSeek \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u0442\u0435\u0439\u043d\u0438\u043a\u0430\u043c\u0438: \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 MoE-\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 ModuleList, \u0430 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0438\u0445 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 DeepseekV2Experts. \u041f\u0438\u0442\u043e\u043d \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u043d\u0435\u043c\u0443 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c 31B-\u0441\u043b\u043e\u0439 \u0413\u0435\u043c\u043c\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0432\u0435\u0441\u043e\u0432, \u043c\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043b\u043e\u0432\u0438\u043b\u0438 Out Of Memory (OOM) \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 Kaggle.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: 1. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u00ab\u0443\u043c\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440\u00bb \u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u044b\u0440\u044f\u0435\u0442 \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u0449\u0435\u0442 \u0441\u043b\u043e\u0438 \u043f\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 gate_proj \u0438 up_proj.2. \u0414\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 OOM \u043c\u044b \u0440\u0430\u0437\u043d\u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c GPU, \u0430 \u0432\u0435\u0441\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u0438 \u043c\u0438\u043a\u0440\u043e-\u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 CPU, \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044f gc.collect(), \u0447\u0442\u043e\u0431\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043e\u0447\u0438\u0449\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0443.\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0435\u043a\u0440\u043e\u043c\u0430\u043d\u0442\u0430\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043c\u044b \u0432\u044b\u043a\u043e\u0432\u0430\u043b\u0438 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0437\u0430\u0449\u0438\u0442\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043f\u043b\u0430\u043d\u0442\u0430\u0446\u0438\u044e. \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.Pythonimport torchimport osimport gcimport transformers.generation.configuration_utils as gen_utilsfrom transformers import (    AutoConfig, AutoModelForCausalLM, AutoTokenizer,     BitsAndBytesConfig, GemmaConfig, CONFIG_MAPPING, GenerationConfig)from transformers.initialization import TORCH_INIT_FUNCTIONS# &#8212; 1. \u041e\u0427\u0418\u0421\u0422\u041a\u0410 \u041f\u0410\u041c\u042f\u0422\u0418 &#8212;def cleanup():    gc.collect()    torch.cuda.empty_cache()cleanup()# &#8212; 2. \u042f\u0414\u0415\u0420\u041d\u042b\u0415 \u041f\u0410\u0422\u0427\u0418 (\u041e\u0431\u0445\u043e\u0434 \u0437\u0430\u0449\u0438\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438) &#8212;print(&#171;\ud83d\udee0 \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0430\u0442\u0447\u0435\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438&#8230;&#187;)# \u041f\u0430\u0442\u0447 2.1: \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0433\u0430 \u0441 dict.to_dict()original_from_model_config = GenerationConfig.from_model_config@classmethoddef patched_from_model_config(cls, model_config):    try: return original_from_model_config(model_config)    except AttributeError:        class ForcedConfig:            def __init__(self, d): self.d = d if isinstance(d, dict) else {}            def to_dict(self): return self.d            def get_text_config(self, *args, **kwargs): return self            def __getattr__(self, name): return self.d.get(name, None)        return original_from_model_config(ForcedConfig(model_config))gen_utils.GenerationConfig.from_model_config = patched_from_model_config# \u041f\u0430\u0442\u0447 2.2: \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f 4-bit \u0432\u0435\u0441\u043e\u0432original_normal = TORCH_INIT_FUNCTIONS[&#171;normal_&#187;]def safe_normal_(tensor, mean=0.0, std=1.0, generator=None):    if tensor.dtype in [torch.uint8, torch.int8]: return tensor    return original_normal(tensor, mean=mean, std=std, generator=generator)TORCH_INIT_FUNCTIONS[&#171;normal_&#187;] = safe_normal_# &#8212; 3. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0418 \u0418 \u0420\u0415\u0413\u0418\u0421\u0422\u0420\u0410\u0426\u0418\u042f &#8212;SKELETON_ID = &#171;livadies\/DeepSeek-V4-Pro-Ghetto-MoE-2-Experts&#187;DONOR_ID = &#171;livadies\/gemma-4-31B-Base-Ghetto-NF4&#8243;CONFIG_MAPPING.register(&#171;gemma4&#187;, GemmaConfig, exist_ok=True)# &#8212; 4. \u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 \u0414\u041e\u041d\u041e\u0420\u0410 (GPU 1) &#8212;print(&#171;\ud83d\udce1 \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0434\u043e\u043d\u043e\u0440\u0430 \u043d\u0430 GPU 1&#8230;&#187;)bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, bnb_4bit_quant_type=&#187;nf4&#8243;)donor = AutoModelForCausalLM.from_pretrained(    DONOR_ID, quantization_config=bnb_config, device_map={&#171;&#187;: 1},     low_cpu_mem_usage=True, trust_remote_code=True)# &#8212; 5. \u0421\u041a\u0415\u041b\u0415\u0422 (CPU) &#8212;print(&#171;\ud83d\udce1 \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442 \u043d\u0430 CPU&#8230;&#187;)config_v4 = AutoConfig.from_pretrained(SKELETON_ID, trust_remote_code=True)with torch.device(&#171;cpu&#187;):    model_v4 = AutoModelForCausalLM.from_config(config_v4, trust_remote_code=True).half()# &#8212; 6. \u0425\u0418\u0420\u0423\u0420\u0413\u0418\u042f (\u0423\u043c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043b\u0430\u043d\u0442\u0430\u0446\u0438\u044f \u0441 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0435\u0439 RAM) &#8212;def adapt_weight(donor_w, target_shape):    &#171;&#187;&#187;\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0443\u043b\u044f\u043c\u0438&#187;&#187;&#187;    with torch.no_grad():        d_tensor = donor_w.to(device=&#187;cpu&#187;, dtype=torch.float16)        new_w = torch.zeros(target_shape, dtype=torch.float16, device=&#187;cpu&#187;)        h, w = min(d_tensor.shape[0], target_shape[0]), min(d_tensor.shape[1], target_shape[1])        new_w[:h, :w] = d_tensor[:h, :w].clone()        return new_wdef find_experts(node):    &#171;&#187;&#187;\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043e\u043d\u0430\u0440 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 DeepseekV2Experts&#187;&#187;&#187;    found = []    if hasattr(node, &#8216;gate_proj&#8217;) and hasattr(node, &#8216;up_proj&#8217;) and hasattr(node, &#8216;down_proj&#8217;):        found.append(node)    elif isinstance(node, (torch.nn.ModuleList, list, tuple)):        for child in node: found.extend(find_experts(child))    elif hasattr(node, &#8216;children&#8217;):        for child in node.children(): found.extend(find_experts(child))    return foundprint(&#171;\ud83d\udc89 \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0443 \u0432\u0435\u0441\u043e\u0432&#8230;&#187;)d_model = donor.model if hasattr(donor, &#8216;model&#8217;) else donord_layers = getattr(d_model, &#8216;layers&#8217;, getattr(d_model, &#8216;h&#8217;, getattr(d_model, &#8216;blocks&#8217;, None)))with torch.no_grad():    for i in range(4): # \u041f\u0435\u0440\u0435\u0441\u0430\u0436\u0438\u0432\u0430\u0435\u043c 4 \u0441\u043b\u043e\u044f        print(f&#187;\ud83e\uddec \u0421\u043b\u043e\u0439 {i}: \u0421\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b&#8230;&#187;)        dl, vl = d_layers[i], model_v4.model.layers[i]        d_mlp = getattr(dl, &#8216;mlp&#8217;, getattr(dl, &#8216;ffn&#8217;, None))                # \u041f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0430 MLP-\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432        if d_mlp:            experts = find_experts(vl.mlp)            for expert in experts:                expert.gate_proj.weight.copy_(adapt_weight(d_mlp.gate_proj.weight, expert.gate_proj.weight.shape))                expert.up_proj.weight.copy_(adapt_weight(d_mlp.up_proj.weight, expert.up_proj.weight.shape))                expert.down_proj.weight.copy_(adapt_weight(d_mlp.down_proj.weight, expert.down_proj.weight.shape))                cleanup() # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b!                # \u041f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0430 Attention        vl.self_attn.q_b_proj.weight.copy_(adapt_weight(dl.self_attn.q_proj.weight, vl.self_attn.q_b_proj.weight.shape))        vl.self_attn.o_proj.weight.copy_(adapt_weight(dl.self_attn.o_proj.weight, vl.self_attn.o_proj.weight.shape))        cleanup()# &#8212; 7. \u0423\u0422\u0418\u041b\u0418\u0417\u0410\u0426\u0418\u042f \u0418 \u0417\u0410\u041f\u0423\u0421\u041a &#8212;print(&#171;\ud83d\uddd1 \u0421\u0436\u0438\u0433\u0430\u0435\u043c \u0434\u043e\u043d\u043e\u0440\u0430 \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f VRAM&#8230;&#187;)del donorcleanup()print(&#171;\ud83d\ude80 \u041e\u0436\u0438\u0432\u043b\u044f\u0435\u043c \u0425\u0438\u043c\u0435\u0440\u0443 \u043d\u0430 GPU 0&#8230;&#187;)model_v4 = model_v4.to(&#171;cuda:0&#187;)# \u041f\u0430\u0442\u0447 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0435def ghetto_route_final(self, logits):    w = torch.nn.functional.softmax(logits.view(-1, logits.shape[-1]) + 1e-6, dim=-1)    tw, ti = torch.topk(w, k=self.top_k, dim=-1)    return ti, tw * self.routed_scaling_factorfor layer in model_v4.model.layers:    if hasattr(layer, &#8216;mlp&#8217;) and hasattr(layer.mlp, &#8216;route_tokens_to_experts&#8217;):        layer.mlp.route_tokens_to_experts = ghetto_route_final.__get__(layer.mlp)print(&#171;\u2728 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044f \u0425\u0438\u043c\u0435\u0440\u044b&#8230;&#187;)tok = AutoTokenizer.from_pretrained(&#171;deepseek-ai\/DeepSeek-V2&#187;, trust_remote_code=True)inputs = tok(&#171;The experimental hybrid AI said:&#187;, return_tensors=&#187;pt&#187;).to(&#171;cuda:0&#187;)with torch.no_grad():    outputs = model_v4.generate(**inputs, max_new_tokens=40, do_sample=True, temperature=0.85)print(&#171;\\n&#187; + &#171;=&#187;*40 + f&#187;\\n\ud83d\udcdf \u041e\u0422\u0412\u0415\u0422:\\n{tok.decode(outputs[0], skip_special_tokens=True)}\\n&#187; + &#171;=&#187;*40)\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435?\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u0435\u0437 Fine-Tuning&#8217;\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 (Vocab Size) \u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u043e\u0434\u0435\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u0442\u0443\u044e \u00ab\u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u0448\u0438\u0437\u043e\u0444\u0440\u0435\u043d\u0438\u044e\u00bb:TheexperimentalhybridAIsaid:vdotsD&#8230;Buddhist&#8230;tomatosupervised&#8230;\u041d\u043e \u0441\u0443\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c ChatGPT \u0437\u0430 \u043d\u043e\u043b\u044c \u0440\u0443\u0431\u043b\u0435\u0439. \u0421\u0443\u0442\u044c \u0432 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438: \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0435\u043d \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0418\u043c\u0435\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432, Python \u0438 \u0433\u043e\u0440\u0441\u0442\u044c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 Kaggle.\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439-\u043c\u0430\u0432\u0437\u043e\u043b\u0435\u0439 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0425\u0438\u043c\u0435\u0440\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 Hugging Face: livadies\/DeepGemma-V4-Chimera-Ghetto-MoE\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 Ghetto MLOps. \u041b\u043e\u043c\u0430\u0439\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c!\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1028910\/<\/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-477700","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477700","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=477700"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477700\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}