import{s as pa,a as Ma,o as Ja,n as ye}from"../chunks/scheduler.cc52f4b9.js";import{S as ra,i as Ua,e as d,s as M,c as i,h as ya,a as j,d as e,b as J,f as ut,g as T,j as I,k as Nl,l as ca,m as a,n as m,o as y,u as rs,t as U,p as o,y as ea,v as Us}from"../chunks/index.9480bb2b.js";import{T as ys}from"../chunks/Tip.f7b80743.js";import{C as wa,H as je,E as ia}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.e0b4ce23.js";import{Y as dt}from"../chunks/Youtube.7b12d9e8.js";import{C}from"../chunks/CodeBlock.d991436c.js";import{C as na}from"../chunks/CourseFloatingBanner.0ea490da.js";import{F as Ta}from"../chunks/FrameworkSwitchCourse.42d12053.js";function ma(h){let t,r;return t=new na({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section6_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section6_tf.ipynb"}]}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function oa(h){let t,r;return t=new na({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section6_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section6_pt.ipynb"}]}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function ua(h){let t,r="Предварительное обучение языковой модели займет некоторое время. Мы рекомендуем сначала запустить цикл обучения на выборке данных, раскомментировав две частичные строки выше, и убедиться, что обучение успешно завершено и модели сохранены. Нет ничего обиднее, чем неудачное обучение на последнем этапе из-за того, что вы забыли создать папку или из-за опечатки в конце цикла обучения!";return{c(){t=d("p"),t.textContent=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-ozo27j"&&(t.textContent=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function da(h){let t,r="✏️ <strong>Попробуйте!</strong> Избавление от всех фрагментов, размер которых меньше размера контекста, не является большой проблемой, поскольку мы используем небольшие контекстные окна. При увеличении размера контекста (или если у вас корпус коротких документов) доля отбрасываемых фрагментов также будет расти. Более эффективный способ подготовки данных - объединить все токенизированные примеры в батч с маркером <code>eos_token_id</code> между ними, а затем выполнить фрагментацию на конкатенированных последовательностях. В качестве упражнения измените функцию <code>tokenize()</code>, чтобы использовать этот подход. Обратите внимание, что вам нужно установить <code>truncation=False</code> и удалить другие аргументы из токенизатора, чтобы получить полную последовательность идентификаторов токенов.";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-14c894c"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function ja(h){let t,r,n,c="С этой конфигурацией мы можем загрузить новую модель. Обратите внимание, что впервые мы не используем функцию <code>from_pretrained()</code>, поскольку фактически инициализируем модель самостоятельно:",_,b,$,k,Z;return t=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBURkdQVDJMTUhlYWRNb2RlbCUyQyUyMEF1dG9Db25maWclMEElMEFjb25maWclMjAlM0QlMjBBdXRvQ29uZmlnLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjAlMjJncHQyJTIyJTJDJTBBJTIwJTIwJTIwJTIwdm9jYWJfc2l6ZSUzRGxlbih0b2tlbml6ZXIpJTJDJTBBJTIwJTIwJTIwJTIwbl9jdHglM0Rjb250ZXh0X2xlbmd0aCUyQyUwQSUyMCUyMCUyMCUyMGJvc190b2tlbl9pZCUzRHRva2VuaXplci5ib3NfdG9rZW5faWQlMkMlMEElMjAlMjAlMjAlMjBlb3NfdG9rZW5faWQlM0R0b2tlbml6ZXIuZW9zX3Rva2VuX2lkJTJDJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, TFGPT2LMHeadModel, AutoConfig

config = AutoConfig.from_pretrained(
    <span class="hljs-string">&quot;gpt2&quot;</span>,
    vocab_size=<span class="hljs-built_in">len</span>(tokenizer),
    n_ctx=context_length,
    bos_token_id=tokenizer.bos_token_id,
    eos_token_id=tokenizer.eos_token_id,
)`,wrap:!1}}),b=new C({props:{code:"bW9kZWwlMjAlM0QlMjBURkdQVDJMTUhlYWRNb2RlbChjb25maWcpJTBBbW9kZWwobW9kZWwuZHVtbXlfaW5wdXRzKSUyMCUyMCUyMyUyMCVEMCVBMSVEMCVCRSVEMCVCNyVEMCVCNCVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMCVCQyVEMCVCRSVEMCVCNCVEMCVCNSVEMCVCQiVEMCVCOCUwQW1vZGVsLnN1bW1hcnkoKQ==",highlighted:`model = TFGPT2LMHeadModel(config)
model(model.dummy_inputs)  <span class="hljs-comment"># Создание модели</span>
model.summary()`,wrap:!1}}),k=new C({props:{code:"X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18lMEFMYXllciUyMCh0eXBlKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME91dHB1dCUyMFNoYXBlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUGFyYW0lMjAlMjMlMjAlMjAlMjAlMEElM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlMEF0cmFuc2Zvcm1lciUyMChURkdQVDJNYWluTGF5ZXIlMjBtdWx0aXBsZSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDEyNDI0MjQzMiUyMCUwQSUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUwQVRvdGFsJTIwcGFyYW1zJTNBJTIwMTI0JTJDMjQyJTJDNDMyJTBBVHJhaW5hYmxlJTIwcGFyYW1zJTNBJTIwMTI0JTJDMjQyJTJDNDMyJTBBTm9uLXRyYWluYWJsZSUyMHBhcmFtcyUzQSUyMDAlMEFfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw==",highlighted:`_________________________________________________________________
Layer (<span class="hljs-built_in">type</span>)                 Output Shape              Param <span class="hljs-comment">#   </span>
=================================================================
transformer (TFGPT2MainLayer multiple                  <span class="hljs-number">124242432</span> 
=================================================================
Total params: <span class="hljs-number">124</span>,<span class="hljs-number">242</span>,<span class="hljs-number">432</span>
Trainable params: <span class="hljs-number">124</span>,<span class="hljs-number">242</span>,<span class="hljs-number">432</span>
Non-trainable params: <span class="hljs-number">0</span>
_________________________________________________________________`,wrap:!1}}),{c(){i(t.$$.fragment),r=M(),n=d("p"),n.innerHTML=c,_=M(),i(b.$$.fragment),$=M(),i(k.$$.fragment)},l(u){T(t.$$.fragment,u),r=J(u),n=j(u,"P",{"data-svelte-h":!0}),I(n)!=="svelte-4fztpc"&&(n.innerHTML=c),_=J(u),T(b.$$.fragment,u),$=J(u),T(k.$$.fragment,u)},m(u,f){m(t,u,f),a(u,r,f),a(u,n,f),a(u,_,f),m(b,u,f),a(u,$,f),m(k,u,f),Z=!0},i(u){Z||(U(t.$$.fragment,u),U(b.$$.fragment,u),U(k.$$.fragment,u),Z=!0)},o(u){y(t.$$.fragment,u),y(b.$$.fragment,u),y(k.$$.fragment,u),Z=!1},d(u){u&&(e(r),e(n),e(_),e($)),o(t,u),o(b,u),o(k,u)}}}function Ia(h){let t,r,n,c="С этой конфигурацией мы можем загрузить новую модель. Обратите внимание, что впервые мы не используем функцию <code>from_pretrained()</code>, поскольку фактически инициализируем модель самостоятельно:",_,b,$,k,Z;return t=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBHUFQyTE1IZWFkTW9kZWwlMkMlMjBBdXRvQ29uZmlnJTBBJTBBY29uZmlnJTIwJTNEJTIwQXV0b0NvbmZpZy5mcm9tX3ByZXRyYWluZWQoJTBBJTIwJTIwJTIwJTIwJTIyZ3B0MiUyMiUyQyUwQSUyMCUyMCUyMCUyMHZvY2FiX3NpemUlM0RsZW4odG9rZW5pemVyKSUyQyUwQSUyMCUyMCUyMCUyMG5fY3R4JTNEY29udGV4dF9sZW5ndGglMkMlMEElMjAlMjAlMjAlMjBib3NfdG9rZW5faWQlM0R0b2tlbml6ZXIuYm9zX3Rva2VuX2lkJTJDJTBBJTIwJTIwJTIwJTIwZW9zX3Rva2VuX2lkJTNEdG9rZW5pemVyLmVvc190b2tlbl9pZCUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, GPT2LMHeadModel, AutoConfig

config = AutoConfig.from_pretrained(
    <span class="hljs-string">&quot;gpt2&quot;</span>,
    vocab_size=<span class="hljs-built_in">len</span>(tokenizer),
    n_ctx=context_length,
    bos_token_id=tokenizer.bos_token_id,
    eos_token_id=tokenizer.eos_token_id,
)`,wrap:!1}}),b=new C({props:{code:"bW9kZWwlMjAlM0QlMjBHUFQyTE1IZWFkTW9kZWwoY29uZmlnKSUwQW1vZGVsX3NpemUlMjAlM0QlMjBzdW0odC5udW1lbCgpJTIwZm9yJTIwdCUyMGluJTIwbW9kZWwucGFyYW1ldGVycygpKSUwQXByaW50KGYlMjJHUFQtMiUyMHNpemUlM0ElMjAlN0Jtb2RlbF9zaXplJTJGMTAwMCoqMiUzQS4xZiU3RE0lMjBwYXJhbWV0ZXJzJTIyKQ==",highlighted:`model = GPT2LMHeadModel(config)
model_size = <span class="hljs-built_in">sum</span>(t.numel() <span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> model.parameters())
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;GPT-2 size: <span class="hljs-subst">{model_size/<span class="hljs-number">1000</span>**<span class="hljs-number">2</span>:<span class="hljs-number">.1</span>f}</span>M parameters&quot;</span>)`,wrap:!1}}),k=new C({props:{code:"R1BULTIlMjBzaXplJTNBJTIwMTI0LjJNJTIwcGFyYW1ldGVycw==",highlighted:'GPT-<span class="hljs-number">2</span> size: <span class="hljs-number">124.2</span>M parameters',wrap:!1}}),{c(){i(t.$$.fragment),r=M(),n=d("p"),n.innerHTML=c,_=M(),i(b.$$.fragment),$=M(),i(k.$$.fragment)},l(u){T(t.$$.fragment,u),r=J(u),n=j(u,"P",{"data-svelte-h":!0}),I(n)!=="svelte-4fztpc"&&(n.innerHTML=c),_=J(u),T(b.$$.fragment,u),$=J(u),T(k.$$.fragment,u)},m(u,f){m(t,u,f),a(u,r,f),a(u,n,f),a(u,_,f),m(b,u,f),a(u,$,f),m(k,u,f),Z=!0},i(u){Z||(U(t.$$.fragment,u),U(b.$$.fragment,u),U(k.$$.fragment,u),Z=!0)},o(u){y(t.$$.fragment,u),y(b.$$.fragment,u),y(k.$$.fragment,u),Z=!1},d(u){u&&(e(r),e(n),e(_),e($)),o(t,u),o(b,u),o(k,u)}}}function fa(h){let t,r;return t=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvckxhbmd1YWdlTW9kZWxpbmclMEElMEF0b2tlbml6ZXIucGFkX3Rva2VuJTIwJTNEJTIwdG9rZW5pemVyLmVvc190b2tlbiUwQWRhdGFfY29sbGF0b3IlMjAlM0QlMjBEYXRhQ29sbGF0b3JGb3JMYW5ndWFnZU1vZGVsaW5nKHRva2VuaXplciUyQyUyMG1sbSUzREZhbHNlJTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QlMjJ0ZiUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForLanguageModeling

tokenizer.pad_token = tokenizer.eos_token
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=<span class="hljs-literal">False</span>, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>)`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function ba(h){let t,r;return t=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvckxhbmd1YWdlTW9kZWxpbmclMEElMEF0b2tlbml6ZXIucGFkX3Rva2VuJTIwJTNEJTIwdG9rZW5pemVyLmVvc190b2tlbiUwQWRhdGFfY29sbGF0b3IlMjAlM0QlMjBEYXRhQ29sbGF0b3JGb3JMYW5ndWFnZU1vZGVsaW5nKHRva2VuaXplciUyQyUyMG1sbSUzREZhbHNlKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForLanguageModeling

tokenizer.pad_token = tokenizer.eos_token
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=<span class="hljs-literal">False</span>)`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function Ca(h){let t,r;return t=new C({props:{code:"aW5wdXRfaWRzJTIwc2hhcGUlM0ElMjAoNSUyQyUyMDEyOCklMEFhdHRlbnRpb25fbWFzayUyMHNoYXBlJTNBJTIwKDUlMkMlMjAxMjgpJTBBbGFiZWxzJTIwc2hhcGUlM0ElMjAoNSUyQyUyMDEyOCk=",highlighted:`input_ids shape: (<span class="hljs-number">5</span>, <span class="hljs-number">128</span>)
attention_mask shape: (<span class="hljs-number">5</span>, <span class="hljs-number">128</span>)
labels shape: (<span class="hljs-number">5</span>, <span class="hljs-number">128</span>)`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function ha(h){let t,r;return t=new C({props:{code:"aW5wdXRfaWRzJTIwc2hhcGUlM0ElMjB0b3JjaC5TaXplKCU1QjUlMkMlMjAxMjglNUQpJTBBYXR0ZW50aW9uX21hc2slMjBzaGFwZSUzQSUyMHRvcmNoLlNpemUoJTVCNSUyQyUyMDEyOCU1RCklMEFsYWJlbHMlMjBzaGFwZSUzQSUyMHRvcmNoLlNpemUoJTVCNSUyQyUyMDEyOCU1RCk=",highlighted:`input_ids shape: torch.Size([<span class="hljs-number">5</span>, <span class="hljs-number">128</span>])
attention_mask shape: torch.Size([<span class="hljs-number">5</span>, <span class="hljs-number">128</span>])
labels shape: torch.Size([<span class="hljs-number">5</span>, <span class="hljs-number">128</span>])`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function ta(h){let t,r="Теперь мы можем использовать метод <code>prepare_tf_dataset()</code> для преобразования наших датасетов в датасеты TensorFlow с помощью коллатора данных, который мы создали выше:",n,c,_;return c=new C({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMG1vZGVsLnByZXBhcmVfdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfZGF0YXNldCU1QiUyMnRyYWluJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0QzMiUyQyUwQSklMEF0Zl9ldmFsX2RhdGFzZXQlMjAlM0QlMjBtb2RlbC5wcmVwYXJlX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVkX2RhdGFzZXQlNUIlMjJ2YWxpZCUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDMyJTJDJTBBKQ==",highlighted:`tf_train_dataset = model.prepare_tf_dataset(
    tokenized_dataset[<span class="hljs-string">&quot;train&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">True</span>,
    batch_size=<span class="hljs-number">32</span>,
)
tf_eval_dataset = model.prepare_tf_dataset(
    tokenized_dataset[<span class="hljs-string">&quot;valid&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">32</span>,
)`,wrap:!1}}),{c(){t=d("p"),t.innerHTML=r,n=M(),i(c.$$.fragment)},l(b){t=j(b,"P",{"data-svelte-h":!0}),I(t)!=="svelte-izpvki"&&(t.innerHTML=r),n=J(b),T(c.$$.fragment,b)},m(b,$){a(b,t,$),a(b,n,$),m(c,b,$),_=!0},i(b){_||(U(c.$$.fragment,b),_=!0)},o(b){y(c.$$.fragment,b),_=!1},d(b){b&&(e(t),e(n)),o(c,b)}}}function _a(h){let t,r="⚠️ Сдвиг входов и меток для их выравнивания происходит внутри модели, поэтому коллатор данных просто копирует входы для создания меток.";return{c(){t=d("p"),t.textContent=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-nge7u8"&&(t.textContent=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function Qa(h){let t,r="Осталось только настроить гиперпараметры обучения и вызвать <code>compile()</code> и <code>fit()</code>. Мы будем использовать график скорости обучения с некоторым разогревом, чтобы повысить стабильность обучения:",n,c,_,b,$="Теперь мы можем просто вызвать <code>model.fit()</code> и дождаться окончания обучения. В зависимости от того, запустите ли вы его на полном или на подмножестве обучающего набора, это займет 20 или 2 часа соответственно, так что захватите несколько чашек кофе и хорошую книгу для чтения! После завершения обучения мы можем отправить модель и токенизатор в Hub:",k,Z,u;return c=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFpbXBvcnQlMjB0ZW5zb3JmbG93JTIwYXMlMjB0ZiUwQSUwQW51bV90cmFpbl9zdGVwcyUyMCUzRCUyMGxlbih0Zl90cmFpbl9kYXRhc2V0KSUwQW9wdGltaXplciUyQyUyMHNjaGVkdWxlJTIwJTNEJTIwY3JlYXRlX29wdGltaXplciglMEElMjAlMjAlMjAlMjBpbml0X2xyJTNENWUtNSUyQyUwQSUyMCUyMCUyMCUyMG51bV93YXJtdXBfc3RlcHMlM0QxXzAwMCUyQyUwQSUyMCUyMCUyMCUyMG51bV90cmFpbl9zdGVwcyUzRG51bV90cmFpbl9zdGVwcyUyQyUwQSUyMCUyMCUyMCUyMHdlaWdodF9kZWNheV9yYXRlJTNEMC4wMSUyQyUwQSklMEFtb2RlbC5jb21waWxlKG9wdGltaXplciUzRG9wdGltaXplciklMEElMEElMjMlMjAlRDAlOUUlRDAlQjElRDElODMlRDElODclRDAlQjUlRDAlQkQlRDAlQjglRDAlQjUlMjAlRDElODElRDAlQkUlMjAlRDElODElRDAlQkMlRDAlQjUlRDElODglRDAlQjAlRDAlQkQlRDAlQkQlRDAlQkUlRDAlQjklMjAlRDElODIlRDAlQkUlRDElODclRDAlQkQlRDAlQkUlRDElODElRDElODIlRDElOEMlRDElOEUlMjBmbG9hdDE2JTBBdGYua2VyYXMubWl4ZWRfcHJlY2lzaW9uLnNldF9nbG9iYWxfcG9saWN5KCUyMm1peGVkX2Zsb2F0MTYlMjIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> create_optimizer
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

num_train_steps = <span class="hljs-built_in">len</span>(tf_train_dataset)
optimizer, schedule = create_optimizer(
    init_lr=<span class="hljs-number">5e-5</span>,
    num_warmup_steps=<span class="hljs-number">1_000</span>,
    num_train_steps=num_train_steps,
    weight_decay_rate=<span class="hljs-number">0.01</span>,
)
model.<span class="hljs-built_in">compile</span>(optimizer=optimizer)

<span class="hljs-comment"># Обучение со смешанной точностью float16</span>
tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">&quot;mixed_float16&quot;</span>)`,wrap:!1}}),Z=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycy5rZXJhc19jYWxsYmFja3MlMjBpbXBvcnQlMjBQdXNoVG9IdWJDYWxsYmFjayUwQSUwQWNhbGxiYWNrJTIwJTNEJTIwUHVzaFRvSHViQ2FsbGJhY2sob3V0cHV0X2RpciUzRCUyMmNvZGVwYXJyb3QtZHMlMjIlMkMlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIpJTBBJTBBbW9kZWwuZml0KHRmX3RyYWluX2RhdGFzZXQlMkMlMjB2YWxpZGF0aW9uX2RhdGElM0R0Zl9ldmFsX2RhdGFzZXQlMkMlMjBjYWxsYmFja3MlM0QlNUJjYWxsYmFjayU1RCk=",highlighted:`<span class="hljs-keyword">from</span> transformers.keras_callbacks <span class="hljs-keyword">import</span> PushToHubCallback

callback = PushToHubCallback(output_dir=<span class="hljs-string">&quot;codeparrot-ds&quot;</span>, tokenizer=tokenizer)

model.fit(tf_train_dataset, validation_data=tf_eval_dataset, callbacks=[callback])`,wrap:!1}}),{c(){t=d("p"),t.innerHTML=r,n=M(),i(c.$$.fragment),_=M(),b=d("p"),b.innerHTML=$,k=M(),i(Z.$$.fragment)},l(f){t=j(f,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1h7fen7"&&(t.innerHTML=r),n=J(f),T(c.$$.fragment,f),_=J(f),b=j(f,"P",{"data-svelte-h":!0}),I(b)!=="svelte-9e33lr"&&(b.innerHTML=$),k=J(f),T(Z.$$.fragment,f)},m(f,g){a(f,t,g),a(f,n,g),m(c,f,g),a(f,_,g),a(f,b,g),a(f,k,g),m(Z,f,g),u=!0},i(f){u||(U(c.$$.fragment,f),U(Z.$$.fragment,f),u=!0)},o(f){y(c.$$.fragment,f),y(Z.$$.fragment,f),u=!1},d(f){f&&(e(t),e(n),e(_),e(b),e(k)),o(c,f),o(Z,f)}}}function ka(h){let t,r="Осталось только настроить аргументы обучения и запустить <code>Trainer</code>. Мы будем использовать косинусный график скорости обучения с некоторым разогревом (warmup) и эффективным размером батча в 256 (<code>per_device_train_batch_size</code> * <code>gradient_accumulation_steps</code>). Аккумулирование градиента используется, когда один батч не помещается в память, и инкрементально накапливает градиент за несколько проходов вперед/назад. Мы увидим это в действии, когда создадим цикл обучения с использованием 🤗 Accelerate.",n,c,_,b,$="Теперь мы можем просто запустить <code>Trainer</code> и дождаться окончания обучения. В зависимости от того, запустите ли вы его на полном или на подмножестве обучающего набора, это займет 20 или 2 часа соответственно, так что захватите несколько чашек кофе и хорошую книгу для чтения!",k,Z,u,f,g="После завершения обучения мы можем отправить модель и токенизатор в Hub:",B,R,z;return c=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluZXIlMkMlMjBUcmFpbmluZ0FyZ3VtZW50cyUwQSUwQWFyZ3MlMjAlM0QlMjBUcmFpbmluZ0FyZ3VtZW50cyglMEElMjAlMjAlMjAlMjBvdXRwdXRfZGlyJTNEJTIyY29kZXBhcnJvdC1kcyUyMiUyQyUwQSUyMCUyMCUyMCUyMHBlcl9kZXZpY2VfdHJhaW5fYmF0Y2hfc2l6ZSUzRDMyJTJDJTBBJTIwJTIwJTIwJTIwcGVyX2RldmljZV9ldmFsX2JhdGNoX3NpemUlM0QzMiUyQyUwQSUyMCUyMCUyMCUyMGV2YWx1YXRpb25fc3RyYXRlZ3klM0QlMjJzdGVwcyUyMiUyQyUwQSUyMCUyMCUyMCUyMGV2YWxfc3RlcHMlM0Q1XzAwMCUyQyUwQSUyMCUyMCUyMCUyMGxvZ2dpbmdfc3RlcHMlM0Q1XzAwMCUyQyUwQSUyMCUyMCUyMCUyMGdyYWRpZW50X2FjY3VtdWxhdGlvbl9zdGVwcyUzRDglMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5fZXBvY2hzJTNEMSUyQyUwQSUyMCUyMCUyMCUyMHdlaWdodF9kZWNheSUzRDAuMSUyQyUwQSUyMCUyMCUyMCUyMHdhcm11cF9zdGVwcyUzRDFfMDAwJTJDJTBBJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyX3R5cGUlM0QlMjJjb3NpbmUlMjIlMkMlMEElMjAlMjAlMjAlMjBsZWFybmluZ19yYXRlJTNENWUtNCUyQyUwQSUyMCUyMCUyMCUyMHNhdmVfc3RlcHMlM0Q1XzAwMCUyQyUwQSUyMCUyMCUyMCUyMGZwMTYlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwcHVzaF90b19odWIlM0RUcnVlJTJDJTBBKSUwQSUwQXRyYWluZXIlMjAlM0QlMjBUcmFpbmVyKCUwQSUyMCUyMCUyMCUyMG1vZGVsJTNEbW9kZWwlMkMlMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMEElMjAlMjAlMjAlMjBhcmdzJTNEYXJncyUyQyUwQSUyMCUyMCUyMCUyMGRhdGFfY29sbGF0b3IlM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwdHJhaW5fZGF0YXNldCUzRHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwZXZhbF9kYXRhc2V0JTNEdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydmFsaWQlMjIlNUQlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Trainer, TrainingArguments

args = TrainingArguments(
    output_dir=<span class="hljs-string">&quot;codeparrot-ds&quot;</span>,
    per_device_train_batch_size=<span class="hljs-number">32</span>,
    per_device_eval_batch_size=<span class="hljs-number">32</span>,
    evaluation_strategy=<span class="hljs-string">&quot;steps&quot;</span>,
    eval_steps=<span class="hljs-number">5_000</span>,
    logging_steps=<span class="hljs-number">5_000</span>,
    gradient_accumulation_steps=<span class="hljs-number">8</span>,
    num_train_epochs=<span class="hljs-number">1</span>,
    weight_decay=<span class="hljs-number">0.1</span>,
    warmup_steps=<span class="hljs-number">1_000</span>,
    lr_scheduler_type=<span class="hljs-string">&quot;cosine&quot;</span>,
    learning_rate=<span class="hljs-number">5e-4</span>,
    save_steps=<span class="hljs-number">5_000</span>,
    fp16=<span class="hljs-literal">True</span>,
    push_to_hub=<span class="hljs-literal">True</span>,
)

trainer = Trainer(
    model=model,
    tokenizer=tokenizer,
    args=args,
    data_collator=data_collator,
    train_dataset=tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>],
    eval_dataset=tokenized_datasets[<span class="hljs-string">&quot;valid&quot;</span>],
)`,wrap:!1}}),Z=new C({props:{code:"dHJhaW5lci50cmFpbigp",highlighted:"trainer.train()",wrap:!1}}),R=new C({props:{code:"dHJhaW5lci5wdXNoX3RvX2h1Yigp",highlighted:"trainer.push_to_hub()",wrap:!1}}),{c(){t=d("p"),t.innerHTML=r,n=M(),i(c.$$.fragment),_=M(),b=d("p"),b.innerHTML=$,k=M(),i(Z.$$.fragment),u=M(),f=d("p"),f.textContent=g,B=M(),i(R.$$.fragment)},l(Q){t=j(Q,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1nf3s2k"&&(t.innerHTML=r),n=J(Q),T(c.$$.fragment,Q),_=J(Q),b=j(Q,"P",{"data-svelte-h":!0}),I(b)!=="svelte-1a0cqk1"&&(b.innerHTML=$),k=J(Q),T(Z.$$.fragment,Q),u=J(Q),f=j(Q,"P",{"data-svelte-h":!0}),I(f)!=="svelte-bhzk8w"&&(f.textContent=g),B=J(Q),T(R.$$.fragment,Q)},m(Q,G){a(Q,t,G),a(Q,n,G),m(c,Q,G),a(Q,_,G),a(Q,b,G),a(Q,k,G),m(Z,Q,G),a(Q,u,G),a(Q,f,G),a(Q,B,G),m(R,Q,G),z=!0},i(Q){z||(U(c.$$.fragment,Q),U(Z.$$.fragment,Q),U(R.$$.fragment,Q),z=!0)},o(Q){y(c.$$.fragment,Q),y(Z.$$.fragment,Q),y(R.$$.fragment,Q),z=!1},d(Q){Q&&(e(t),e(n),e(_),e(b),e(k),e(u),e(f),e(B)),o(c,Q),o(Z,Q),o(R,Q)}}}function Za(h){let t,r="✏️ <strong>Попробуйте!</strong> Всего около 30 строк кода в дополнение к <code>TrainingArguments</code> понадобилось нам, чтобы перейти от сырых текстов к обучению GPT-2. Попробуйте это на своем датасете и посмотрите, сможете ли вы получить хорошие результаты!";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1dw9rou"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function $a(h){let t,r='💡 Если у вас есть доступ к компьютеру с несколькими GPU, вы можете попробовать использовать контекст <code>MirroredStrategy</code> для существенного ускорения обучения. Вам нужно будет создать объект <code>tf.distribute.MirroredStrategy</code> и убедиться, что все методы <code>to_tf_dataset()</code> или <code>prepare_tf_dataset()</code>, а также создание модели и вызов <code>fit()</code> выполняются в его контексте <code>scope()</code>. Документацию на эту тему можно посмотреть <a href="https://www.tensorflow.org/guide/distributed_training#use_tfdistributestrategy_with_keras_modelfit" rel="nofollow">здесь</a>.';return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1kqm4nz"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},d(n){n&&e(t)}}}function ga(h){let t,r="💡 Если у вас есть доступ к компьютеру с несколькими GPU, попробуйте запустить код на нем. <code>Trainer</code> автоматически управляет несколькими компьютерами, и это может значительно ускорить обучение.";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1q5fhtd"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},d(n){n&&e(t)}}}function Ga(h){let t;function r(_,b){return _[0]==="pt"?ga:$a}let n=r(h),c=n(h);return{c(){c.c(),t=ea()},l(_){c.l(_),t=ea()},m(_,b){c.m(_,b),a(_,t,b)},p(_,b){n!==(n=r(_))&&(c.d(1),c=n(_),c&&(c.c(),c.m(t.parentNode,t)))},d(_){_&&e(t),c.d(_)}}}function Ra(h){let t,r;return t=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBY291cnNlX21vZGVsJTIwJTNEJTIwVEZHUFQyTE1IZWFkTW9kZWwuZnJvbV9wcmV0cmFpbmVkKCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRmNvZGVwYXJyb3QtZHMlMjIpJTBBY291cnNlX3Rva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRmNvZGVwYXJyb3QtZHMlMjIpJTBBcGlwZSUyMCUzRCUyMHBpcGVsaW5lKCUwQSUyMCUyMCUyMCUyMCUyMnRleHQtZ2VuZXJhdGlvbiUyMiUyQyUyMG1vZGVsJTNEY291cnNlX21vZGVsJTJDJTIwdG9rZW5pemVyJTNEY291cnNlX3Rva2VuaXplciUyQyUyMGRldmljZSUzRDAlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

course_model = TFGPT2LMHeadModel.from_pretrained(<span class="hljs-string">&quot;huggingface-course/codeparrot-ds&quot;</span>)
course_tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;huggingface-course/codeparrot-ds&quot;</span>)
pipe = pipeline(
    <span class="hljs-string">&quot;text-generation&quot;</span>, model=course_model, tokenizer=course_tokenizer, device=<span class="hljs-number">0</span>
)`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function Ba(h){let t,r;return t=new C({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwcGlwZWxpbmUlMEElMEFkZXZpY2UlMjAlM0QlMjB0b3JjaC5kZXZpY2UoJTIyY3VkYSUyMiklMjBpZiUyMHRvcmNoLmN1ZGEuaXNfYXZhaWxhYmxlKCklMjBlbHNlJTIwdG9yY2guZGV2aWNlKCUyMmNwdSUyMiklMEFwaXBlJTIwJTNEJTIwcGlwZWxpbmUoJTBBJTIwJTIwJTIwJTIwJTIydGV4dC1nZW5lcmF0aW9uJTIyJTJDJTIwbW9kZWwlM0QlMjJodWdnaW5nZmFjZS1jb3Vyc2UlMkZjb2RlcGFycm90LWRzJTIyJTJDJTIwZGV2aWNlJTNEZGV2aWNlJTBBKQ==",highlighted:`<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

device = torch.device(<span class="hljs-string">&quot;cuda&quot;</span>) <span class="hljs-keyword">if</span> torch.cuda.is_available() <span class="hljs-keyword">else</span> torch.device(<span class="hljs-string">&quot;cpu&quot;</span>)
pipe = pipeline(
    <span class="hljs-string">&quot;text-generation&quot;</span>, model=<span class="hljs-string">&quot;huggingface-course/codeparrot-ds&quot;</span>, device=device
)`,wrap:!1}}),{c(){i(t.$$.fragment)},l(n){T(t.$$.fragment,n)},m(n,c){m(t,n,c),r=!0},i(n){r||(U(t.$$.fragment,n),r=!0)},o(n){y(t.$$.fragment,n),r=!1},d(n){o(t,n)}}}function Xa(h){let t,r="Глядя на эти несколько примеров, кажется, что модель усвоила часть синтаксиса стека Python Data Science (конечно, нам нужно будет оценить это более тщательно, прежде чем разворачивать модель в реальном мире). Однако иногда требуется более тщательная настройка обучения модели, чтобы добиться необходимого качества работы для конкретного случая использования. Например, если мы хотим динамически обновлять размер батча или иметь условный цикл обучения, который пропускает плохие примеры на лету? Одним из вариантов может быть подкласс <code>Trainer</code> и добавление необходимых изменений, но иногда проще написать цикл обучения с нуля. Вот тут-то и приходит на помощь 🤗 Accelerate.";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-2r59bq"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},d(n){n&&e(t)}}}function Va(h){let t,r="Глядя на эти несколько примеров, кажется, что модель усвоила часть синтаксиса стека Python Data Science. Конечно, нам нужно будет более тщательно оценить модель, прежде чем внедрять ее в реальный мир, но все же это впечатляющий прототип.";return{c(){t=d("p"),t.textContent=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1nt9web"&&(t.textContent=r)},m(n,c){a(n,t,c)},d(n){n&&e(t)}}}function aa(h){let t,r,n,c="Мы уже видели, как обучать модель с помощью <code>Trainer</code>, который позволяет сделать некоторые настройки. Однако иногда нам нужен полный контроль над циклом обучения, или мы хотим внести некоторые экзотические изменения. В этом случае 🤗 Accelerate - отличный выбор, и в этом разделе мы рассмотрим шаги по его использованию для обучения нашей модели. Чтобы сделать все более интересным, мы также добавим изюминку в цикл обучения.",_,b,$,k,Z="Поскольку нас в основном интересует разумное автодополнение для библиотек data science, имеет смысл придать больший вес обучающим примерам, в которых чаще используются эти библиотеки. Мы можем легко определить эти примеры по использованию таких ключевых слов, как <code>plt</code>, <code>pd</code>, <code>sk</code>, <code>fit</code> и <code>predict</code>, которые являются наиболее частыми именами для импорта <code>matplotlib.pyplot</code>, <code>pandas</code> и <code>sklearn</code>, а также шаблонам fit/predict для последней. Если каждый из них представлен в виде одного токена, мы можем легко проверить, встречаются ли они во входной последовательности. Токены могут иметь пробельный префикс, поэтому мы также проверим наличие таких версий в словаре токенизатора. Чтобы убедиться, что все работает, мы добавим один тестовый токен, который должен быть разбит на несколько токенов:",u,f,g,B,R,z,Q="Отлично, похоже, это прекрасно работает! Теперь мы можем написать пользовательскую функцию потерь, которая принимает входную последовательность, логиты и ключевые токены, которые мы только что выбрали в качестве входных данных. Сначала нам нужно выровнять логиты и входные данные: входная последовательность, сдвинутая на единицу вправо, формирует метки, поскольку следующий токен является меткой для текущего токена. Мы можем добиться этого, начиная метки со второго токена входной последовательности, поскольку модель все равно не делает предсказания для первого токена. Затем мы отсекаем последний логит, поскольку у нас нет метки для токена, который следует за всей входной последовательностью. Таким образом, мы можем вычислить потери для каждого примера и подсчитать количество вхождений всех ключевых слов в каждом примере. Наконец, мы вычисляем средневзвешенное значение по всем примерам, используя вхождения в качестве весов. Поскольку мы не хотим отбрасывать все выборки, в которых нет ключевых слов, мы добавляем 1 к весам:",G,kl,Al,x,cs="Прежде чем приступить к обучению с этой потрясающей новой функцией потерь, нам нужно подготовить несколько вещей:",el,Zl,ws="<li>Нам нужны загрузчики данных, чтобы загружать данные батчами.</li> <li>Нам нужно настроить параметры затухания веса (weight decay).</li> <li>Время от времени мы хотим проводить оценку, поэтому имеет смысл обернуть код оценки в функцию.</li>",E,$l,is="Давайте начнем с загрузчиков данных. Нам нужно только задать для датасета формат <code>&quot;torch&quot;</code>, а затем мы можем передать его в PyTorch <code>DataLoader</code> с соответствующим размером батча:",tl,gl,vl,N,Ts="Далее мы группируем параметры, чтобы оптимизатор знал, какие из них получат дополнительное затухание веса. Обычно все смещения (bias) и весовые коэффициенты LayerNorm (LayerNorm weights) исключаются из этого правила; вот как мы можем это реализовать:",al,Gl,Fl,A,Ie="Поскольку мы хотим регулярно оценивать модель на валидационном множестве во время обучения, давайте напишем функцию и для этого. Она просто запускается через загрузчик оценочных данных и собирает все потери:",Yl,v,Hl,F,fe='С помощью функции <code>evaluate()</code> мы можем сообщать о потерях и <a href="../chapter7/3">перплексии</a> через регулярные промежутки времени. Далее мы переопределим нашу модель, чтобы убедиться, что мы снова обучаемся с нуля:',Sl,Y,Dl,H,ms="Затем мы можем определить наш оптимизатор, используя предыдущую функцию для части параметров для затухания веса:",nl,Rl,ql,S,os="Теперь давайте подготовим модель, оптимизатор и загрузчики данных, чтобы начать обучение:",pl,Bl,Ll,D,Kl,q,us="Теперь, когда мы отправили наш <code>train_dataloader</code> в <code>accelerator.prepare()</code>, мы можем использовать его длину для вычисления количества шагов обучения. Помните, что это всегда нужно делать после подготовки загрузчика данных, так как этот метод изменит его длину. Мы используем классический линейный график скорости обучения до 0:",Ml,Xl,Pl,L,be="Наконец, чтобы отправить нашу модель в Hub, нам нужно создать объект <code>Repository</code> в рабочей папке. Сначала войдите в Hub Hugging Face, если вы еще не вошли в него. Мы определим имя розитория по идентификатору модели, который мы хотим присвоить нашей модели (не стесняйтесь заменить <code>repo_name</code> на свой собственный вариант; он просто должен содержать ваше имя пользователя, что и делает функция <code>get_full_repo_name()</code>):",Ol,K,ls,P,ss,W,ds="Затем мы можем клонировать этот розиторий в локальную папку. Если она уже существует, эта локальная папка должна быть существующим клоном розитория, с которым мы работаем:",Jl,Vl,es,O,js="Теперь мы можем загрузить все, что сохранили в <code>output_dir</code>, вызвав метод <code>repo.push_to_hub()</code>. Это поможет нам загружать промежуточные модели в конце каждой эпохи.",rl,Ul,El="Перед обучением давайте проведем быстрый тест, чтобы проверить, правильно ли работает функция оценки:",Is,yl,cl,wl,il,Tl,Wl="Это очень высокие значения для потерь и перплексии, но это неудивительно, ведь мы еще не обучили модель. Итак, у нас все готово для написания основной части скрипта обучения: цикла обучения. В цикле обучения мы выполняем итерации по загрузчику данных и передаем батчи в модель. С помощью логитов мы можем оценить нашу пользовательскую функцию потерь. Мы масштабируем потери по количеству шагов накопления градиента, чтобы не создавать больших потерь при агрегировании большего количества шагов. Перед оптимизацией мы также обрезаем градиенты для лучшей сходимости. Наконец, каждые несколько шагов мы оцениваем модель на оценочном наборе с помощью нашей новой функции <code>evaluate()</code>:",fs,ml,ol,zl,bs="Вот и все — теперь у вас есть свой собственный цикл обучения для каузальных языковых моделей, таких как GPT-2, который вы можете дополнительно настроить под свои нужды.",sl,xl,ts,ll,Cs;return t=new je({props:{title:"Обучение с 🤗 Accelerate",local:"training-with-accelerate",headingTag:"h2"}}),b=new dt({props:{id:"Hm8_PgVTFuc"}}),f=new C({props:{code:"a2V5dG9rZW5faWRzJTIwJTNEJTIwJTVCJTVEJTBBZm9yJTIwa2V5d29yZCUyMGluJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIycGx0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIycGQlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJzayUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMmZpdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMnByZWRpY3QlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjIlMjBwbHQlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjIlMjBwZCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMiUyMHNrJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyJTIwZml0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyJTIwcHJlZGljdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMnRlc3R0ZXN0JTIyJTJDJTBBJTVEJTNBJTBBJTIwJTIwJTIwJTIwaWRzJTIwJTNEJTIwdG9rZW5pemVyKCU1QmtleXdvcmQlNUQpLmlucHV0X2lkcyU1QjAlNUQlMEElMjAlMjAlMjAlMjBpZiUyMGxlbihpZHMpJTIwJTNEJTNEJTIwMSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGtleXRva2VuX2lkcy5hcHBlbmQoaWRzJTVCMCU1RCklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQoZiUyMktleXdvcmQlMjBoYXMlMjBub3QlMjBzaW5nbGUlMjB0b2tlbiUzQSUyMCU3QmtleXdvcmQlN0QlMjIp",highlighted:`keytoken_ids = []
<span class="hljs-keyword">for</span> keyword <span class="hljs-keyword">in</span> [
    <span class="hljs-string">&quot;plt&quot;</span>,
    <span class="hljs-string">&quot;pd&quot;</span>,
    <span class="hljs-string">&quot;sk&quot;</span>,
    <span class="hljs-string">&quot;fit&quot;</span>,
    <span class="hljs-string">&quot;predict&quot;</span>,
    <span class="hljs-string">&quot; plt&quot;</span>,
    <span class="hljs-string">&quot; pd&quot;</span>,
    <span class="hljs-string">&quot; sk&quot;</span>,
    <span class="hljs-string">&quot; fit&quot;</span>,
    <span class="hljs-string">&quot; predict&quot;</span>,
    <span class="hljs-string">&quot;testtest&quot;</span>,
]:
    ids = tokenizer([keyword]).input_ids[<span class="hljs-number">0</span>]
    <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(ids) == <span class="hljs-number">1</span>:
        keytoken_ids.append(ids[<span class="hljs-number">0</span>])
    <span class="hljs-keyword">else</span>:
        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Keyword has not single token: <span class="hljs-subst">{keyword}</span>&quot;</span>)`,wrap:!1}}),B=new C({props:{code:"J0tleXdvcmQlMjBoYXMlMjBub3QlMjBzaW5nbGUlMjB0b2tlbiUzQSUyMHRlc3R0ZXN0Jw==",highlighted:'<span class="hljs-string">&#x27;Keyword has not single token: testtest&#x27;</span>',wrap:!1}}),kl=new C({props:{code:"ZnJvbSUyMHRvcmNoLm5uJTIwaW1wb3J0JTIwQ3Jvc3NFbnRyb3B5TG9zcyUwQWltcG9ydCUyMHRvcmNoJTBBJTBBJTBBZGVmJTIwa2V5dG9rZW5fd2VpZ2h0ZWRfbG9zcyhpbnB1dHMlMkMlMjBsb2dpdHMlMkMlMjBrZXl0b2tlbl9pZHMlMkMlMjBhbHBoYSUzRDEuMCklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjAlRDAlQTElRDAlQjQlRDAlQjIlRDAlQjglRDAlQjMlRDAlQjAlRDAlQjUlRDAlQkMlMjAlRDElODIlRDAlQjAlRDAlQkElMkMlMjAlRDElODclRDElODIlRDAlQkUlRDAlQjElRDElOEIlMjAlRDElODIlRDAlQkUlRDAlQkElRDAlQjUlRDAlQkQlRDElOEIlMjAlM0MlMjBuJTIwJUQwJUJGJUQxJTgwJUQwJUI1JUQwJUI0JUQxJTgxJUQwJUJBJUQwJUIwJUQwJUI3JUQxJThCJUQwJUIyJUQwJUIwJUQwJUJCJUQwJUI4JTIwbiUwQSUyMCUyMCUyMCUyMHNoaWZ0X2xhYmVscyUyMCUzRCUyMGlucHV0cyU1Qi4uLiUyQyUyMDElM0ElNUQuY29udGlndW91cygpJTBBJTIwJTIwJTIwJTIwc2hpZnRfbG9naXRzJTIwJTNEJTIwbG9naXRzJTVCLi4uJTJDJTIwJTNBLTElMkMlMjAlM0ElNUQuY29udGlndW91cygpJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTkyJUQxJThCJUQxJTg3JUQwJUI4JUQxJTgxJUQwJUJCJUQxJThGJUQwJUI1JUQwJUJDJTIwJUQwJUJGJUQwJUJFJUQxJTgyJUQwJUI1JUQxJTgwJUQwJUI4JTIwJUQwJUJEJUQwJUIwJTIwJUQwJUJBJUQwJUIwJUQwJUI2JUQwJUI0JUQxJThCJUQwJUI5JTIwJUQxJTgyJUQwJUJFJUQwJUJBJUQwJUI1JUQwJUJEJTBBJTIwJTIwJTIwJTIwbG9zc19mY3QlMjAlM0QlMjBDcm9zc0VudHJvcHlMb3NzKHJlZHVjZSUzREZhbHNlKSUwQSUyMCUyMCUyMCUyMGxvc3MlMjAlM0QlMjBsb3NzX2ZjdChzaGlmdF9sb2dpdHMudmlldygtMSUyQyUyMHNoaWZ0X2xvZ2l0cy5zaXplKC0xKSklMkMlMjBzaGlmdF9sYWJlbHMudmlldygtMSkpJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTk4JUQwJUI3JUQwJUJDJUQwJUI1JUQwJUJEJUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUJDJUQwJUI1JUQxJTgwJUQwJUIwJTIwJUQwJUI4JTIwJUQxJTgxJUQxJTgwJUQwJUI1JUQwJUI0JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQwJUJGJUQwJUJFJUQxJTgyJUQwJUI1JUQxJTgwJUQwJUI4JTIwJUQwJUJEJUQwJUIwJTIwJUQwJUJBJUQwJUIwJUQwJUI2JUQwJUI0JUQxJThCJUQwJUI5JTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQwJUJDJUQwJUI1JUQxJTgwJTBBJTIwJTIwJTIwJTIwbG9zc19wZXJfc2FtcGxlJTIwJTNEJTIwbG9zcy52aWV3KHNoaWZ0X2xvZ2l0cy5zaXplKDApJTJDJTIwc2hpZnRfbG9naXRzLnNpemUoMSkpLm1lYW4oYXhpcyUzRDEpJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUEwJUQwJUIwJUQxJTgxJUQxJTg3JUQwJUI1JUQxJTgyJTIwJUQwJUI4JTIwJUQwJUJDJUQwJUIwJUQxJTgxJUQxJTg4JUQxJTgyJUQwJUIwJUQwJUIxJUQwJUI4JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUIwJUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQwJUIyJUQwJUI1JUQxJTgxJUQwJUJFJUQwJUIyJTBBJTIwJTIwJTIwJTIwd2VpZ2h0cyUyMCUzRCUyMHRvcmNoLnN0YWNrKCU1QihpbnB1dHMlMjAlM0QlM0QlMjBrdCkuZmxvYXQoKSUyMGZvciUyMGt0JTIwaW4lMjBrZXl0b2tlbl9pZHMlNUQpLnN1bSglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBheGlzJTNEJTVCMCUyQyUyMDIlNUQlMEElMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwd2VpZ2h0cyUyMCUzRCUyMGFscGhhJTIwKiUyMCgxLjAlMjAlMkIlMjB3ZWlnaHRzKSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCVBMCVEMCVCMCVEMSU4MSVEMSU4NyVEMCVCNSVEMSU4MiUyMCVEMCVCMiVEMCVCNyVEMCVCMiVEMCVCNSVEMSU4OCVEMCVCNSVEMCVCRCVEMCVCRCVEMCVCRSVEMCVCMyVEMCVCRSUyMCVEMSU4MSVEMSU4MCVEMCVCNSVEMCVCNCVEMCVCRCVEMCVCNSVEMCVCMyVEMCVCRSUwQSUyMCUyMCUyMCUyMHdlaWdodGVkX2xvc3MlMjAlM0QlMjAobG9zc19wZXJfc2FtcGxlJTIwKiUyMHdlaWdodHMpLm1lYW4oKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHdlaWdodGVkX2xvc3M=",highlighted:`<span class="hljs-keyword">from</span> torch.nn <span class="hljs-keyword">import</span> CrossEntropyLoss
<span class="hljs-keyword">import</span> torch


<span class="hljs-keyword">def</span> <span class="hljs-title function_">keytoken_weighted_loss</span>(<span class="hljs-params">inputs, logits, keytoken_ids, alpha=<span class="hljs-number">1.0</span></span>):
    <span class="hljs-comment"># Сдвигаем так, чтобы токены &lt; n предсказывали n</span>
    shift_labels = inputs[..., <span class="hljs-number">1</span>:].contiguous()
    shift_logits = logits[..., :-<span class="hljs-number">1</span>, :].contiguous()
    <span class="hljs-comment"># Вычисляем потери на каждый токен</span>
    loss_fct = CrossEntropyLoss(reduce=<span class="hljs-literal">False</span>)
    loss = loss_fct(shift_logits.view(-<span class="hljs-number">1</span>, shift_logits.size(-<span class="hljs-number">1</span>)), shift_labels.view(-<span class="hljs-number">1</span>))
    <span class="hljs-comment"># Изменение размера и средние потери на каждый пример</span>
    loss_per_sample = loss.view(shift_logits.size(<span class="hljs-number">0</span>), shift_logits.size(<span class="hljs-number">1</span>)).mean(axis=<span class="hljs-number">1</span>)
    <span class="hljs-comment"># Расчет и масштабирование весов</span>
    weights = torch.stack([(inputs == kt).<span class="hljs-built_in">float</span>() <span class="hljs-keyword">for</span> kt <span class="hljs-keyword">in</span> keytoken_ids]).<span class="hljs-built_in">sum</span>(
        axis=[<span class="hljs-number">0</span>, <span class="hljs-number">2</span>]
    )
    weights = alpha * (<span class="hljs-number">1.0</span> + weights)
    <span class="hljs-comment"># Расчет взвешенного среднего</span>
    weighted_loss = (loss_per_sample * weights).mean()
    <span class="hljs-keyword">return</span> weighted_loss`,wrap:!1}}),gl=new C({props:{code:"ZnJvbSUyMHRvcmNoLnV0aWxzLmRhdGEuZGF0YWxvYWRlciUyMGltcG9ydCUyMERhdGFMb2FkZXIlMEElMEF0b2tlbml6ZWRfZGF0YXNldC5zZXRfZm9ybWF0KCUyMnRvcmNoJTIyKSUwQXRyYWluX2RhdGFsb2FkZXIlMjAlM0QlMjBEYXRhTG9hZGVyKHRva2VuaXplZF9kYXRhc2V0JTVCJTIydHJhaW4lMjIlNUQlMkMlMjBiYXRjaF9zaXplJTNEMzIlMkMlMjBzaHVmZmxlJTNEVHJ1ZSklMEFldmFsX2RhdGFsb2FkZXIlMjAlM0QlMjBEYXRhTG9hZGVyKHRva2VuaXplZF9kYXRhc2V0JTVCJTIydmFsaWQlMjIlNUQlMkMlMjBiYXRjaF9zaXplJTNEMzIp",highlighted:`<span class="hljs-keyword">from</span> torch.utils.data.dataloader <span class="hljs-keyword">import</span> DataLoader

tokenized_dataset.set_format(<span class="hljs-string">&quot;torch&quot;</span>)
train_dataloader = DataLoader(tokenized_dataset[<span class="hljs-string">&quot;train&quot;</span>], batch_size=<span class="hljs-number">32</span>, shuffle=<span class="hljs-literal">True</span>)
eval_dataloader = DataLoader(tokenized_dataset[<span class="hljs-string">&quot;valid&quot;</span>], batch_size=<span class="hljs-number">32</span>)`,wrap:!1}}),Gl=new C({props:{code:"d2VpZ2h0X2RlY2F5JTIwJTNEJTIwMC4xJTBBJTBBJTBBZGVmJTIwZ2V0X2dyb3VwZWRfcGFyYW1zKG1vZGVsJTJDJTIwbm9fZGVjYXklM0QlNUIlMjJiaWFzJTIyJTJDJTIwJTIyTGF5ZXJOb3JtLndlaWdodCUyMiU1RCklM0ElMEElMjAlMjAlMjAlMjBwYXJhbXNfd2l0aF93ZCUyQyUyMHBhcmFtc193aXRob3V0X3dkJTIwJTNEJTIwJTVCJTVEJTJDJTIwJTVCJTVEJTBBJTIwJTIwJTIwJTIwZm9yJTIwbiUyQyUyMHAlMjBpbiUyMG1vZGVsLm5hbWVkX3BhcmFtZXRlcnMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwYW55KG5kJTIwaW4lMjBuJTIwZm9yJTIwbmQlMjBpbiUyMG5vX2RlY2F5KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhcmFtc193aXRob3V0X3dkLmFwcGVuZChwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXJhbXNfd2l0aF93ZC5hcHBlbmQocCklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjJwYXJhbXMlMjIlM0ElMjBwYXJhbXNfd2l0aF93ZCUyQyUyMCUyMndlaWdodF9kZWNheSUyMiUzQSUyMHdlaWdodF9kZWNheSU3RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMnBhcmFtcyUyMiUzQSUyMHBhcmFtc193aXRob3V0X3dkJTJDJTIwJTIyd2VpZ2h0X2RlY2F5JTIyJTNBJTIwMC4wJTdEJTJDJTBBJTIwJTIwJTIwJTIwJTVE",highlighted:`weight_decay = <span class="hljs-number">0.1</span>


<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_grouped_params</span>(<span class="hljs-params">model, no_decay=[<span class="hljs-string">&quot;bias&quot;</span>, <span class="hljs-string">&quot;LayerNorm.weight&quot;</span>]</span>):
    params_with_wd, params_without_wd = [], []
    <span class="hljs-keyword">for</span> n, p <span class="hljs-keyword">in</span> model.named_parameters():
        <span class="hljs-keyword">if</span> <span class="hljs-built_in">any</span>(nd <span class="hljs-keyword">in</span> n <span class="hljs-keyword">for</span> nd <span class="hljs-keyword">in</span> no_decay):
            params_without_wd.append(p)
        <span class="hljs-keyword">else</span>:
            params_with_wd.append(p)
    <span class="hljs-keyword">return</span> [
        {<span class="hljs-string">&quot;params&quot;</span>: params_with_wd, <span class="hljs-string">&quot;weight_decay&quot;</span>: weight_decay},
        {<span class="hljs-string">&quot;params&quot;</span>: params_without_wd, <span class="hljs-string">&quot;weight_decay&quot;</span>: <span class="hljs-number">0.0</span>},
    ]`,wrap:!1}}),v=new C({props:{code:"ZGVmJTIwZXZhbHVhdGUoKSUzQSUwQSUyMCUyMCUyMCUyMG1vZGVsLmV2YWwoKSUwQSUyMCUyMCUyMCUyMGxvc3NlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMGZvciUyMHN0ZXAlMkMlMjBiYXRjaCUyMGluJTIwZW51bWVyYXRlKGV2YWxfZGF0YWxvYWRlciklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMCUzRCUyMG1vZGVsKGJhdGNoJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTJDJTIwbGFiZWxzJTNEYmF0Y2glNUIlMjJpbnB1dF9pZHMlMjIlNUQpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zc2VzLmFwcGVuZChhY2NlbGVyYXRvci5nYXRoZXIob3V0cHV0cy5sb3NzKSklMEElMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwdG9yY2gubWVhbih0b3JjaC5jYXQobG9zc2VzKSklMEElMjAlMjAlMjAlMjB0cnklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwZXJwbGV4aXR5JTIwJTNEJTIwdG9yY2guZXhwKGxvc3MpJTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwT3ZlcmZsb3dFcnJvciUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBlcnBsZXhpdHklMjAlM0QlMjBmbG9hdCglMjJpbmYlMjIpJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwbG9zcy5pdGVtKCklMkMlMjBwZXJwbGV4aXR5Lml0ZW0oKQ==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">evaluate</span>():
    model.<span class="hljs-built_in">eval</span>()
    losses = []
    <span class="hljs-keyword">for</span> step, batch <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(eval_dataloader):
        <span class="hljs-keyword">with</span> torch.no_grad():
            outputs = model(batch[<span class="hljs-string">&quot;input_ids&quot;</span>], labels=batch[<span class="hljs-string">&quot;input_ids&quot;</span>])

        losses.append(accelerator.gather(outputs.loss))
    loss = torch.mean(torch.cat(losses))
    <span class="hljs-keyword">try</span>:
        perplexity = torch.exp(loss)
    <span class="hljs-keyword">except</span> OverflowError:
        perplexity = <span class="hljs-built_in">float</span>(<span class="hljs-string">&quot;inf&quot;</span>)
    <span class="hljs-keyword">return</span> loss.item(), perplexity.item()`,wrap:!1}}),Y=new C({props:{code:"bW9kZWwlMjAlM0QlMjBHUFQyTE1IZWFkTW9kZWwoY29uZmlnKQ==",highlighted:"model = GPT2LMHeadModel(config)",wrap:!1}}),Rl=new C({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltJTIwaW1wb3J0JTIwQWRhbVclMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBBZGFtVyhnZXRfZ3JvdXBlZF9wYXJhbXMobW9kZWwpJTJDJTIwbHIlM0Q1ZS00KQ==",highlighted:`<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW

optimizer = AdamW(get_grouped_params(model), lr=<span class="hljs-number">5e-4</span>)`,wrap:!1}}),Bl=new C({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoZnAxNiUzRFRydWUpJTBBJTBBbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTIwJTNEJTIwYWNjZWxlcmF0b3IucHJlcGFyZSglMEElMjAlMjAlMjAlMjBtb2RlbCUyQyUyMG9wdGltaXplciUyQyUyMHRyYWluX2RhdGFsb2FkZXIlMkMlMjBldmFsX2RhdGFsb2FkZXIlMEEp",highlighted:`<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator

accelerator = Accelerator(fp16=<span class="hljs-literal">True</span>)

model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`,wrap:!1}}),D=new ys({props:{$$slots:{default:[Ea]},$$scope:{ctx:h}}}),Xl=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGdldF9zY2hlZHVsZXIlMEElMEFudW1fdHJhaW5fZXBvY2hzJTIwJTNEJTIwMSUwQW51bV91cGRhdGVfc3RlcHNfcGVyX2Vwb2NoJTIwJTNEJTIwbGVuKHRyYWluX2RhdGFsb2FkZXIpJTBBbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX3RyYWluX2Vwb2NocyUyMColMjBudW1fdXBkYXRlX3N0ZXBzX3Blcl9lcG9jaCUwQSUwQWxyX3NjaGVkdWxlciUyMCUzRCUyMGdldF9zY2hlZHVsZXIoJTBBJTIwJTIwJTIwJTIwbmFtZSUzRCUyMmxpbmVhciUyMiUyQyUwQSUyMCUyMCUyMCUyMG9wdGltaXplciUzRG9wdGltaXplciUyQyUwQSUyMCUyMCUyMCUyMG51bV93YXJtdXBfc3RlcHMlM0QxXzAwMCUyQyUwQSUyMCUyMCUyMCUyMG51bV90cmFpbmluZ19zdGVwcyUzRG51bV90cmFpbmluZ19zdGVwcyUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> get_scheduler

num_train_epochs = <span class="hljs-number">1</span>
num_update_steps_per_epoch = <span class="hljs-built_in">len</span>(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch

lr_scheduler = get_scheduler(
    name=<span class="hljs-string">&quot;linear&quot;</span>,
    optimizer=optimizer,
    num_warmup_steps=<span class="hljs-number">1_000</span>,
    num_training_steps=num_training_steps,
)`,wrap:!1}}),K=new C({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMFJlcG9zaXRvcnklMkMlMjBnZXRfZnVsbF9yZXBvX25hbWUlMEElMEFtb2RlbF9uYW1lJTIwJTNEJTIwJTIyY29kZXBhcnJvdC1kcy1hY2NlbGVyYXRlJTIyJTBBcmVwb19uYW1lJTIwJTNEJTIwZ2V0X2Z1bGxfcmVwb19uYW1lKG1vZGVsX25hbWUpJTBBcmVwb19uYW1l",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> Repository, get_full_repo_name

model_name = <span class="hljs-string">&quot;codeparrot-ds-accelerate&quot;</span>
repo_name = get_full_repo_name(model_name)
repo_name`,wrap:!1}}),P=new C({props:{code:"J3NndWdnZXIlMkZjb2RlcGFycm90LWRzLWFjY2VsZXJhdGUn",highlighted:'<span class="hljs-string">&#x27;sgugger/codeparrot-ds-accelerate&#x27;</span>',wrap:!1}}),Vl=new C({props:{code:"b3V0cHV0X2RpciUyMCUzRCUyMCUyMmNvZGVwYXJyb3QtZHMtYWNjZWxlcmF0ZSUyMiUwQXJlcG8lMjAlM0QlMjBSZXBvc2l0b3J5KG91dHB1dF9kaXIlMkMlMjBjbG9uZV9mcm9tJTNEcmVwb19uYW1lKQ==",highlighted:`output_dir = <span class="hljs-string">&quot;codeparrot-ds-accelerate&quot;</span>
repo = Repository(output_dir, clone_from=repo_name)`,wrap:!1}}),yl=new C({props:{code:"ZXZhbHVhdGUoKQ==",highlighted:"evaluate()",wrap:!1}}),wl=new C({props:{code:"KDEwLjkzNDEyNjg1Mzk0Mjg3MSUyQyUyMDU2MDU3LjE0NDUzMTI1KQ==",highlighted:'(<span class="hljs-number">10.934126853942871</span>, <span class="hljs-number">56057.14453125</span>)',wrap:!1}}),ml=new C({props:{code:"ZnJvbSUyMHRxZG0ubm90ZWJvb2slMjBpbXBvcnQlMjB0cWRtJTBBJTBBZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzJTIwJTNEJTIwOCUwQWV2YWxfc3RlcHMlMjAlM0QlMjA1XzAwMCUwQSUwQW1vZGVsLnRyYWluKCklMEFjb21wbGV0ZWRfc3RlcHMlMjAlM0QlMjAwJTBBZm9yJTIwZXBvY2glMjBpbiUyMHJhbmdlKG51bV90cmFpbl9lcG9jaHMpJTNBJTBBJTIwJTIwJTIwJTIwZm9yJTIwc3RlcCUyQyUyMGJhdGNoJTIwaW4lMjB0cWRtKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVudW1lcmF0ZSh0cmFpbl9kYXRhbG9hZGVyJTJDJTIwc3RhcnQlM0QxKSUyQyUyMHRvdGFsJTNEbnVtX3RyYWluaW5nX3N0ZXBzJTBBJTIwJTIwJTIwJTIwKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxvZ2l0cyUyMCUzRCUyMG1vZGVsKGJhdGNoJTVCJTIyaW5wdXRfaWRzJTIyJTVEKS5sb2dpdHMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwa2V5dG9rZW5fd2VpZ2h0ZWRfbG9zcyhiYXRjaCU1QiUyMmlucHV0X2lkcyUyMiU1RCUyQyUyMGxvZ2l0cyUyQyUyMGtleXRva2VuX2lkcyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHN0ZXAlMjAlMjUlMjAxMDAlMjAlM0QlM0QlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IucHJpbnQoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyc2FtcGxlcyUyMiUzQSUyMHN0ZXAlMjAqJTIwc2FtcGxlc19wZXJfc3RlcCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnN0ZXBzJTIyJTNBJTIwY29tcGxldGVkX3N0ZXBzJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIybG9zcyUyRnRyYWluJTIyJTNBJTIwbG9zcy5pdGVtKCklMjAqJTIwZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxvc3MlMjAlM0QlMjBsb3NzJTIwJTJGJTIwZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IuYmFja3dhcmQobG9zcyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHN0ZXAlMjAlMjUlMjBncmFkaWVudF9hY2N1bXVsYXRpb25fc3RlcHMlMjAlM0QlM0QlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IuY2xpcF9ncmFkX25vcm1fKG1vZGVsLnBhcmFtZXRlcnMoKSUyQyUyMDEuMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuc3RlcCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplci56ZXJvX2dyYWQoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbXBsZXRlZF9zdGVwcyUyMCUyQiUzRCUyMDElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMChzdGVwJTIwJTI1JTIwKGV2YWxfc3RlcHMlMjAqJTIwZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzKSklMjAlM0QlM0QlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXZhbF9sb3NzJTJDJTIwcGVycGxleGl0eSUyMCUzRCUyMGV2YWx1YXRlKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY2NlbGVyYXRvci5wcmludCglN0IlMjJsb3NzJTJGZXZhbCUyMiUzQSUyMGV2YWxfbG9zcyUyQyUyMCUyMnBlcnBsZXhpdHklMjIlM0ElMjBwZXJwbGV4aXR5JTdEKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG1vZGVsLnRyYWluKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY2NlbGVyYXRvci53YWl0X2Zvcl9ldmVyeW9uZSgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdW53cmFwcGVkX21vZGVsJTIwJTNEJTIwYWNjZWxlcmF0b3IudW53cmFwX21vZGVsKG1vZGVsKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHVud3JhcHBlZF9tb2RlbC5zYXZlX3ByZXRyYWluZWQob3V0cHV0X2RpciUyQyUyMHNhdmVfZnVuY3Rpb24lM0RhY2NlbGVyYXRvci5zYXZlKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwYWNjZWxlcmF0b3IuaXNfbWFpbl9wcm9jZXNzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdG9rZW5pemVyLnNhdmVfcHJldHJhaW5lZChvdXRwdXRfZGlyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcG8ucHVzaF90b19odWIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29tbWl0X21lc3NhZ2UlM0RmJTIyVHJhaW5pbmclMjBpbiUyMHByb2dyZXNzJTIwc3RlcCUyMCU3QnN0ZXAlN0QlMjIlMkMlMjBibG9ja2luZyUzREZhbHNlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKQ==",highlighted:`<span class="hljs-keyword">from</span> tqdm.notebook <span class="hljs-keyword">import</span> tqdm

gradient_accumulation_steps = <span class="hljs-number">8</span>
eval_steps = <span class="hljs-number">5_000</span>

model.train()
completed_steps = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_train_epochs):
    <span class="hljs-keyword">for</span> step, batch <span class="hljs-keyword">in</span> tqdm(
        <span class="hljs-built_in">enumerate</span>(train_dataloader, start=<span class="hljs-number">1</span>), total=num_training_steps
    ):
        logits = model(batch[<span class="hljs-string">&quot;input_ids&quot;</span>]).logits
        loss = keytoken_weighted_loss(batch[<span class="hljs-string">&quot;input_ids&quot;</span>], logits, keytoken_ids)
        <span class="hljs-keyword">if</span> step % <span class="hljs-number">100</span> == <span class="hljs-number">0</span>:
            accelerator.<span class="hljs-built_in">print</span>(
                {
                    <span class="hljs-string">&quot;samples&quot;</span>: step * samples_per_step,
                    <span class="hljs-string">&quot;steps&quot;</span>: completed_steps,
                    <span class="hljs-string">&quot;loss/train&quot;</span>: loss.item() * gradient_accumulation_steps,
                }
            )
        loss = loss / gradient_accumulation_steps
        accelerator.backward(loss)
        <span class="hljs-keyword">if</span> step % gradient_accumulation_steps == <span class="hljs-number">0</span>:
            accelerator.clip_grad_norm_(model.parameters(), <span class="hljs-number">1.0</span>)
            optimizer.step()
            lr_scheduler.step()
            optimizer.zero_grad()
            completed_steps += <span class="hljs-number">1</span>
        <span class="hljs-keyword">if</span> (step % (eval_steps * gradient_accumulation_steps)) == <span class="hljs-number">0</span>:
            eval_loss, perplexity = evaluate()
            accelerator.<span class="hljs-built_in">print</span>({<span class="hljs-string">&quot;loss/eval&quot;</span>: eval_loss, <span class="hljs-string">&quot;perplexity&quot;</span>: perplexity})
            model.train()
            accelerator.wait_for_everyone()
            unwrapped_model = accelerator.unwrap_model(model)
            unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)
            <span class="hljs-keyword">if</span> accelerator.is_main_process:
                tokenizer.save_pretrained(output_dir)
                repo.push_to_hub(
                    commit_message=<span class="hljs-string">f&quot;Training in progress step <span class="hljs-subst">{step}</span>&quot;</span>, blocking=<span class="hljs-literal">False</span>
                )`,wrap:!1}}),xl=new ys({props:{$$slots:{default:[Wa]},$$scope:{ctx:h}}}),ll=new ys({props:{$$slots:{default:[za]},$$scope:{ctx:h}}}),{c(){i(t.$$.fragment),r=M(),n=d("p"),n.innerHTML=c,_=M(),i(b.$$.fragment),$=M(),k=d("p"),k.innerHTML=Z,u=M(),i(f.$$.fragment),g=M(),i(B.$$.fragment),R=M(),z=d("p"),z.textContent=Q,G=M(),i(kl.$$.fragment),Al=M(),x=d("p"),x.textContent=cs,el=M(),Zl=d("ul"),Zl.innerHTML=ws,E=M(),$l=d("p"),$l.innerHTML=is,tl=M(),i(gl.$$.fragment),vl=M(),N=d("p"),N.textContent=Ts,al=M(),i(Gl.$$.fragment),Fl=M(),A=d("p"),A.textContent=Ie,Yl=M(),i(v.$$.fragment),Hl=M(),F=d("p"),F.innerHTML=fe,Sl=M(),i(Y.$$.fragment),Dl=M(),H=d("p"),H.textContent=ms,nl=M(),i(Rl.$$.fragment),ql=M(),S=d("p"),S.textContent=os,pl=M(),i(Bl.$$.fragment),Ll=M(),i(D.$$.fragment),Kl=M(),q=d("p"),q.innerHTML=us,Ml=M(),i(Xl.$$.fragment),Pl=M(),L=d("p"),L.innerHTML=be,Ol=M(),i(K.$$.fragment),ls=M(),i(P.$$.fragment),ss=M(),W=d("p"),W.textContent=ds,Jl=M(),i(Vl.$$.fragment),es=M(),O=d("p"),O.innerHTML=js,rl=M(),Ul=d("p"),Ul.textContent=El,Is=M(),i(yl.$$.fragment),cl=M(),i(wl.$$.fragment),il=M(),Tl=d("p"),Tl.innerHTML=Wl,fs=M(),i(ml.$$.fragment),ol=M(),zl=d("p"),zl.textContent=bs,sl=M(),i(xl.$$.fragment),ts=M(),i(ll.$$.fragment)},l(s){T(t.$$.fragment,s),r=J(s),n=j(s,"P",{"data-svelte-h":!0}),I(n)!=="svelte-1hh02u2"&&(n.innerHTML=c),_=J(s),T(b.$$.fragment,s),$=J(s),k=j(s,"P",{"data-svelte-h":!0}),I(k)!=="svelte-j2o5gr"&&(k.innerHTML=Z),u=J(s),T(f.$$.fragment,s),g=J(s),T(B.$$.fragment,s),R=J(s),z=j(s,"P",{"data-svelte-h":!0}),I(z)!=="svelte-y7kcip"&&(z.textContent=Q),G=J(s),T(kl.$$.fragment,s),Al=J(s),x=j(s,"P",{"data-svelte-h":!0}),I(x)!=="svelte-4er7mj"&&(x.textContent=cs),el=J(s),Zl=j(s,"UL",{"data-svelte-h":!0}),I(Zl)!=="svelte-m33afo"&&(Zl.innerHTML=ws),E=J(s),$l=j(s,"P",{"data-svelte-h":!0}),I($l)!=="svelte-1l6ms9b"&&($l.innerHTML=is),tl=J(s),T(gl.$$.fragment,s),vl=J(s),N=j(s,"P",{"data-svelte-h":!0}),I(N)!=="svelte-c5rme"&&(N.textContent=Ts),al=J(s),T(Gl.$$.fragment,s),Fl=J(s),A=j(s,"P",{"data-svelte-h":!0}),I(A)!=="svelte-7alvq7"&&(A.textContent=Ie),Yl=J(s),T(v.$$.fragment,s),Hl=J(s),F=j(s,"P",{"data-svelte-h":!0}),I(F)!=="svelte-1yi78ft"&&(F.innerHTML=fe),Sl=J(s),T(Y.$$.fragment,s),Dl=J(s),H=j(s,"P",{"data-svelte-h":!0}),I(H)!=="svelte-1rggiuk"&&(H.textContent=ms),nl=J(s),T(Rl.$$.fragment,s),ql=J(s),S=j(s,"P",{"data-svelte-h":!0}),I(S)!=="svelte-azvcff"&&(S.textContent=os),pl=J(s),T(Bl.$$.fragment,s),Ll=J(s),T(D.$$.fragment,s),Kl=J(s),q=j(s,"P",{"data-svelte-h":!0}),I(q)!=="svelte-1vyyk38"&&(q.innerHTML=us),Ml=J(s),T(Xl.$$.fragment,s),Pl=J(s),L=j(s,"P",{"data-svelte-h":!0}),I(L)!=="svelte-uv83b7"&&(L.innerHTML=be),Ol=J(s),T(K.$$.fragment,s),ls=J(s),T(P.$$.fragment,s),ss=J(s),W=j(s,"P",{"data-svelte-h":!0}),I(W)!=="svelte-1v5dp30"&&(W.textContent=ds),Jl=J(s),T(Vl.$$.fragment,s),es=J(s),O=j(s,"P",{"data-svelte-h":!0}),I(O)!=="svelte-2q65e7"&&(O.innerHTML=js),rl=J(s),Ul=j(s,"P",{"data-svelte-h":!0}),I(Ul)!=="svelte-1e6bywf"&&(Ul.textContent=El),Is=J(s),T(yl.$$.fragment,s),cl=J(s),T(wl.$$.fragment,s),il=J(s),Tl=j(s,"P",{"data-svelte-h":!0}),I(Tl)!=="svelte-p89lie"&&(Tl.innerHTML=Wl),fs=J(s),T(ml.$$.fragment,s),ol=J(s),zl=j(s,"P",{"data-svelte-h":!0}),I(zl)!=="svelte-nvpmd6"&&(zl.textContent=bs),sl=J(s),T(xl.$$.fragment,s),ts=J(s),T(ll.$$.fragment,s)},m(s,w){m(t,s,w),a(s,r,w),a(s,n,w),a(s,_,w),m(b,s,w),a(s,$,w),a(s,k,w),a(s,u,w),m(f,s,w),a(s,g,w),m(B,s,w),a(s,R,w),a(s,z,w),a(s,G,w),m(kl,s,w),a(s,Al,w),a(s,x,w),a(s,el,w),a(s,Zl,w),a(s,E,w),a(s,$l,w),a(s,tl,w),m(gl,s,w),a(s,vl,w),a(s,N,w),a(s,al,w),m(Gl,s,w),a(s,Fl,w),a(s,A,w),a(s,Yl,w),m(v,s,w),a(s,Hl,w),a(s,F,w),a(s,Sl,w),m(Y,s,w),a(s,Dl,w),a(s,H,w),a(s,nl,w),m(Rl,s,w),a(s,ql,w),a(s,S,w),a(s,pl,w),m(Bl,s,w),a(s,Ll,w),m(D,s,w),a(s,Kl,w),a(s,q,w),a(s,Ml,w),m(Xl,s,w),a(s,Pl,w),a(s,L,w),a(s,Ol,w),m(K,s,w),a(s,ls,w),m(P,s,w),a(s,ss,w),a(s,W,w),a(s,Jl,w),m(Vl,s,w),a(s,es,w),a(s,O,w),a(s,rl,w),a(s,Ul,w),a(s,Is,w),m(yl,s,w),a(s,cl,w),m(wl,s,w),a(s,il,w),a(s,Tl,w),a(s,fs,w),m(ml,s,w),a(s,ol,w),a(s,zl,w),a(s,sl,w),m(xl,s,w),a(s,ts,w),m(ll,s,w),Cs=!0},i(s){Cs||(U(t.$$.fragment,s),U(b.$$.fragment,s),U(f.$$.fragment,s),U(B.$$.fragment,s),U(kl.$$.fragment,s),U(gl.$$.fragment,s),U(Gl.$$.fragment,s),U(v.$$.fragment,s),U(Y.$$.fragment,s),U(Rl.$$.fragment,s),U(Bl.$$.fragment,s),U(D.$$.fragment,s),U(Xl.$$.fragment,s),U(K.$$.fragment,s),U(P.$$.fragment,s),U(Vl.$$.fragment,s),U(yl.$$.fragment,s),U(wl.$$.fragment,s),U(ml.$$.fragment,s),U(xl.$$.fragment,s),U(ll.$$.fragment,s),Cs=!0)},o(s){y(t.$$.fragment,s),y(b.$$.fragment,s),y(f.$$.fragment,s),y(B.$$.fragment,s),y(kl.$$.fragment,s),y(gl.$$.fragment,s),y(Gl.$$.fragment,s),y(v.$$.fragment,s),y(Y.$$.fragment,s),y(Rl.$$.fragment,s),y(Bl.$$.fragment,s),y(D.$$.fragment,s),y(Xl.$$.fragment,s),y(K.$$.fragment,s),y(P.$$.fragment,s),y(Vl.$$.fragment,s),y(yl.$$.fragment,s),y(wl.$$.fragment,s),y(ml.$$.fragment,s),y(xl.$$.fragment,s),y(ll.$$.fragment,s),Cs=!1},d(s){s&&(e(r),e(n),e(_),e($),e(k),e(u),e(g),e(R),e(z),e(G),e(Al),e(x),e(el),e(Zl),e(E),e($l),e(tl),e(vl),e(N),e(al),e(Fl),e(A),e(Yl),e(Hl),e(F),e(Sl),e(Dl),e(H),e(nl),e(ql),e(S),e(pl),e(Ll),e(Kl),e(q),e(Ml),e(Pl),e(L),e(Ol),e(ls),e(ss),e(W),e(Jl),e(es),e(O),e(rl),e(Ul),e(Is),e(cl),e(il),e(Tl),e(fs),e(ol),e(zl),e(sl),e(ts)),o(t,s),o(b,s),o(f,s),o(B,s),o(kl,s),o(gl,s),o(Gl,s),o(v,s),o(Y,s),o(Rl,s),o(Bl,s),o(D,s),o(Xl,s),o(K,s),o(P,s),o(Vl,s),o(yl,s),o(wl,s),o(ml,s),o(xl,s),o(ll,s)}}}function Ea(h){let t,r='🚨 Если вы проводите обучение на TPU, вам нужно будет перенести весь код, начиная с ячейки выше, в выделенную функцию обучения. Подробнее смотрите <a href="../chapter3/1">Главу 3</a>.';return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1cmpybo"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function Wa(h){let t,r="✏️ <strong>Попробуйте!</strong> Либо создайте свою собственную функцию потерь, подходящую для вашего случая, либо добавьте еще один пользовательский шаг в цикл обучения.";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1veg44b"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function za(h){let t,r="✏️ <strong>Попробуйте!</strong> При проведении длительных экспериментов по обучению полезно регистрировать важные метрики с помощью таких инструментов, как TensorBoard или Weights &amp; Biases. Добавьте соответствующее логирование в цикл обучения, чтобы вы всегда могли проверить, как проходит обучение.";return{c(){t=d("p"),t.innerHTML=r},l(n){t=j(n,"P",{"data-svelte-h":!0}),I(t)!=="svelte-1sk98yf"&&(t.innerHTML=r)},m(n,c){a(n,t,c)},p:ye,d(n){n&&e(t)}}}function xa(h){let t,r,n,c,_,b,$,k,Z,u,f,g,B,R,z='До сих пор мы в основном использовали предварительно обученные модели и осуществляли их дообучение для новых случаев использования, повторно используя веса, полученные в ходе предварительного обучения. Как мы видели в <a href="../chapter1/1">Главе 1</a>, это принято называть <em>трансферным обучением</em>, и это очень успешная стратегия применения моделей Transformer для большинства реальных случаев использования, когда размеченных данных недостаточно. В этой главе мы применим другой подход и обучим совершенно новую модель с нуля. Это хороший подход, если у вас много данных, и они сильно отличаются от данных предварительного обучения, используемых для имеющихся моделей. Однако предварительное обучение языковой модели требует значительно больше вычислительных ресурсов, чем дообучение существующей. Примеры, когда имеет смысл обучать новую модель, включают датасеты, состоящие из музыкальных нот, молекулярных последовательностей, таких как ДНК, или языков программирования. Последние в недавнее время получили широкое распространение благодаря таким инструментам, как TabNine и GitHub’s Copilot, работающим на основе модели Codex от OpenAI, которые могут генерировать длинные последовательности кода. Для решения этой задачи генерации текста лучше всего подходят авторегрессионные или каузальные языковые модели, такие как GPT-2.',Q,G,kl="В этом разделе мы построим уменьшенную версию модели генерации кода: мы сосредоточимся на однострочных завершениях вместо полных функций или классов, используя подмножество кода Python. Работая с данными на Python, вы часто сталкиваетесь со стеком Data Science на Python, состоящем из библиотек <code>matplotlib</code>, <code>seaborn</code>, <code>pandas</code> и <code>scikit-learn</code>. При использовании этих фреймворков часто возникает необходимость поиска определенных команд, поэтому было бы неплохо, если бы мы могли использовать модель выполненяющую эти вызововы за нас.",Al,x,cs,el,Zl='В <a href="../chapter6/1">Главе 6</a> мы создали эффективный токенизатор для обработки исходного кода Python, но нам все еще нужен крупный датасет для предварительного обучения модели. Здесь мы применим наш токенизатор к корпусу кода Python, полученному из розиториев GitHub. Затем мы воспользуемся API <code>Trainer</code> и 🤗 Accelerate для обучения модели. Приступим!',ws,E,$l,is,tl,gl='На самом деле это демонстрация модели, которая была обучена и загружена в Hub с помощью кода, приведенного в этом разделе. Вы можете найти ее <a href="https://huggingface.co/huggingface-course/codeparrot-ds?text=plt.imshow%28" rel="nofollow">здесь</a>. Обратите внимание, что поскольку при генерации текста происходит некоторая рандомизация, вы, вероятно, получите немного другой результат.',vl,N,Ts,al,Gl='Код на Python в изобилии доступен в таких репозиториях кода, как GitHub, и мы можем использовать его для создания датасета путем поиска каждого розитория Python. Именно такой подход был использован в книге <a href="https://learning.oreilly.com/library/view/natural-language-processing/9781098136789/" rel="nofollow">Transformers textbook</a> для предварительного обучения большой модели GPT-2. Используя дамп GitHub объемом около 180 ГБ, содержащий примерно 20 миллионов файлов Python под названием <code>codeparrot</code>, авторы создали датасет, которым затем поделились на <a href="https://huggingface.co/datasets/transformersbook/codeparrot" rel="nofollow">Hugging Face Hub</a>.',Fl,A,Ie="Однако обучение на полном корпусе требует много времени и вычислений, а нам нужно только подмножество датасетов, связанных со стеком data science на Python. Итак, давайте начнем с фильтрации датасета <code>codeparrot</code> по всем файлам, включающим любую из библиотек из этого стека. Из-за большого размера датасета мы хотим избежать его загрузки; вместо этого мы будем использовать функцию потоковой передачи (streaming), чтобы фильтровать его на лету. Чтобы помочь нам отфильтровать примеры кода с использованием библиотек, о которых мы говорили ранее, мы воспользуемся следующей функцией:",Yl,v,Hl,F,fe="Давайте протестируем ее на двух примерах:",Sl,Y,Dl,H,ms,nl,Rl="Мы можем использовать ее для создания функции, которая будет передавать датасет и отфильтровывать нужные нам элементы:",ql,S,os,pl,Bl="Затем мы можем просто применить эту функцию к потоковому датасету:",Ll,D,Kl,q,us,Ml,Xl="Таким образом, у нас остается около 3% от исходного датасета, что все равно довольно много - результирующий датасет занимает 6 ГБ и состоит из 600 000 Python-скриптов!",Pl,L,be="Фильтрация полного датасета может занять 2-3 часа в зависимости от вашей машины и пропускной способности сети. Если вы не хотите выполнять этот длительный процесс самостоятельно, мы предоставляем отфильтрованный датасет на Hub для загрузки:",Ol,K,ls,P,ss,W,ds,Jl,Vl="Давайте рассмотрим пример из датасета. Мы покажем только первые 200 символов каждого поля:",es,O,js,rl,Ul,El,Is="Мы видим, что поле <code>content</code> содержит код, на котором мы хотим обучить нашу модель. Теперь, когда у нас есть датасет, нам нужно подготовить тексты, чтобы они были в формате, подходящем для предварительного обучения.",yl,cl,wl,il,Tl,Wl,fs="Первым шагом будет токенизация данных, чтобы мы могли использовать их для обучения. Поскольку наша цель - автозаполнение коротких вызовов функций, мы можем оставить размер контекста относительно небольшим. Благодаря этому мы сможем обучать модель гораздо быстрее, и она будет занимать значительно меньше памяти. Если для вашего приложения важно, чтобы контекст был больше (например, если вы хотите, чтобы модель писала юнит-тесты на основе файла с определением функции), обязательно увеличьте это число, но не забывайте, что это приведет к увеличению объема памяти GPU. Пока что давайте зафиксируем размер контекста на 128 токенов, в отличие от 1 024 или 2 048, используемых в GPT-2 или GPT-3 соответственно.",ml,ol,zl='Большинство документов содержит гораздо больше 128 токенов, поэтому простое обрезание входных данных до максимальной длины приведет к тому, что большая часть нашего датасета будет удалена. Вместо этого мы используем параметр <code>return_overflowing_tokens</code> для токенизации всего ввода и разбиения его на части, как мы делали в <a href="../chapter6/4">Главе 6</a>. Мы также будем использовать параметр <code>return_length</code>, чтобы автоматически возвращать длину каждого созданного фрагмента. Часто последний фрагмент будет меньше размера контекста, и мы избавимся от этих фрагментов, чтобы избежать проблем с дополнением; на самом деле они нам не нужны, поскольку у нас и так много данных.',bs,sl,xl='<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/chunking_texts.svg" alt="Chunking a large texts in several pieces."/> <img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/chunking_texts-dark.svg" alt="Chunking a large texts in several pieces."/>',ts,ll,Cs="Давайте посмотрим, как это работает, на первых двух примерах:",s,w,he,hs,_e,_s,jt="Из этих двух примеров видно, что в общей сложности мы получили 34 сегмента. Взглянув на длину фрагментов, мы видим, что фрагменты в конце обоих документов содержат менее 128 токенов (117 и 41, соответственно). Это лишь малая часть всех имеющихся у нас фрагментов, поэтому мы можем смело отбросить их. С помощью поля <code>overflow_to_sample_mapping</code> мы также можем восстановить, какие фрагменты принадлежали каким входным примерам.",Qe,Qs,It='В этой операции мы используем удобную особенность функции <code>Dataset.map()</code> из 🤗 Datasets, которая заключается в том, что она не требует отображения один к одному; как мы видели в <a href="../chapter7/3">разделе 3</a>, мы можем создавать батч с большим или меньшим количеством элементов, чем входной батч. Это полезно при выполнении таких операций, как аугментация или фильтрация данных, которые изменяют количество элементов. В нашем случае при токенизации каждого элемента на фрагменты заданного размера контекста мы создаем много примеров из каждого документа. Нам просто нужно убедиться, что мы удалили существующие столбцы, поскольку они имеют противоречивый размер. Если бы мы хотели их сохранить, то могли бы повторить их соответствующим образом и вернуть в рамках вызова <code>Dataset.map()</code>:',ke,ks,Ze,Zs,$e,$s,ft="Теперь у нас есть 16,7 миллиона примеров со 128 токенами в каждом, что соответствует примерно 2,1 миллиарда токенов в общей сложности. Для сравнения, модели OpenAI GPT-3 и Codex обучены на 300 и 100 миллиардах токенов соответственно, причем модели Codex инициализируются из контрольных точек GPT-3. Наша цель в этом разделе - не конкурировать с этими моделями, которые могут генерировать длинные, связные тексты, а создать уменьшенную версию, обеспечивающую быструю функцию автозаполнения для специалистов по обработке данных.",ge,gs,bt="Теперь, когда у нас есть готовый датасет, давайте создадим модель!",Ge,ns,Re,Gs,Be,Rs,Ct="Наш первый шаг - инициализация свежей модели GPT-2. Мы будем использовать ту же конфигурацию для нашей модели, что и для маленькой модели GPT-2, поэтому загрузим предварительно обученную конфигурацию, убедимся, что размер токенизатора соответствует размеру словарного запаса модели, и передадим идентификаторы токенов <code>bos</code> и <code>eos</code> (начало и конец последовательности):",Xe,ul,dl,ce,Bs,ht="Наша модель имеет 124 миллиона параметров, которые нам предстоит дообучить. Прежде чем начать обучение, нам нужно настроить коллатор данных, который займется созданием батчей. Мы можем использовать коллатор <code>DataCollatorForLanguageModeling</code>, который разработан специально для языкового моделирования (о чем недвусмысленно говорит его название). Помимо стекирования и дополнения батчей, он также заботится о создании меток языковой модели - в каузальном языковом моделировании входы тоже служат метками (просто сдвинутыми на один элемент), и этот коллатор данных создает их на лету во время обучения, так что нам не нужно дублировать <code>input_ids</code>.",Ve,Xs,_t="Обратите внимание, что <code>DataCollatorForLanguageModeling</code> поддерживает как маскированное языковое моделирование (masked language modeling - MLM), так и каузальное языковое моделирование (causal language modeling - CLM). По умолчанию он подготавливает данные для MLM, но мы можем переключиться на CLM, задав аргумент <code>mlm=False</code>:",Ee,jl,Il,we,Vs,Qt="Давайте посмотрим на пример:",We,Es,ze,fl,bl,ie,Ws,kt="Мы видим, что примеры были стекированы, и все тензоры имеют одинаковую форму.",xe,Te,ps,Ne,zs,Zt="Теперь у нас есть все необходимое для обучения нашей модели - в конце концов, это было не так уж и сложно! Прежде чем приступить к обучению, мы должны войти в Hugging Face. Если вы работаете в блокноте, вы можете сделать это с помощью следующей служебной функции:",Ae,xs,ve,Ns,$t="Появится виджет, в котором вы можете ввести свои учетные данные для входа в Hugging Face.",Fe,As,gt="Если вы работаете не в блокноте, просто введите следующую строку в терминале:",Ye,vs,He,Cl,hl,me,Ms,Se,Js,De,Fs,qe,Ys,Gt="Настал момент истины: давайте посмотрим, насколько хорошо работает обученная модель! В логах мы видим, что потери постоянно снижаются, но чтобы проверить модель на практике, давайте посмотрим, насколько хорошо она работает на некоторых подсказках. Для этого мы обернем модель в <code>pipeline</code> для генерации текста и поместим ее на GPU для быстрой генерации, если таковой доступен:",Le,_l,Ql,oe,Hs,Rt="Давайте начнем с простой задачи - создания диаграммы рассеивания (scatter plot):",Ke,Ss,Pe,Ds,Oe,qs,Bt="Результат выглядит корректно. Работает ли это также для <code>pandas</code> операции? Давайте посмотрим, сможем ли мы создать <code>DataFrame</code> из двух массивов:",lt,Ls,st,Ks,et,Ps,Xt="Отлично, это правильный ответ — хотя затем он снова вставляет столбец <code>x</code>. Поскольку количество генерируемых токенов ограничено, следующий цикл <code>for</code> обрывается. Давайте посмотрим, сможем ли мы сделать что-то более сложное, и чтобы модель помогла нам использовать операцию <code>groupby</code>:",tt,Os,at,le,nt,se,Vt="Неплохо; это правильный способ сделать это. Наконец, давайте посмотрим, сможем ли мы также использовать его для <code>scikit-learn</code> и создать модель Random Forest:",pt,ee,Mt,te,Jt,ue,de,ae,rt,Ce,Ut;_=new Ta({props:{fw:h[0]}}),$=new wa({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),Z=new je({props:{title:"Обучение каузальной языковой модели с нуля",local:"training-a-causal-language-model-from-scratch",headingTag:"h1"}});const Et=[oa,ma],ne=[];function Wt(l,p){return l[0]==="pt"?0:1}f=Wt(h),g=ne[f]=Et[f](h),x=new dt({props:{id:"Vpjb1lu0MDk"}}),N=new je({props:{title:"Сбор данных",local:"gathering-the-data",headingTag:"h2"}}),v=new C({props:{code:"ZGVmJTIwYW55X2tleXdvcmRfaW5fc3RyaW5nKHN0cmluZyUyQyUyMGtleXdvcmRzKSUzQSUwQSUyMCUyMCUyMCUyMGZvciUyMGtleXdvcmQlMjBpbiUyMGtleXdvcmRzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBrZXl3b3JkJTIwaW4lMjBzdHJpbmclM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjBUcnVlJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwRmFsc2U=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">any_keyword_in_string</span>(<span class="hljs-params">string, keywords</span>):
    <span class="hljs-keyword">for</span> keyword <span class="hljs-keyword">in</span> keywords:
        <span class="hljs-keyword">if</span> keyword <span class="hljs-keyword">in</span> string:
            <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span>
    <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span>`,wrap:!1}}),Y=new C({props:{code:"ZmlsdGVycyUyMCUzRCUyMCU1QiUyMnBhbmRhcyUyMiUyQyUyMCUyMnNrbGVhcm4lMjIlMkMlMjAlMjJtYXRwbG90bGliJTIyJTJDJTIwJTIyc2VhYm9ybiUyMiU1RCUwQWV4YW1wbGVfMSUyMCUzRCUyMCUyMmltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUyMiUwQWV4YW1wbGVfMiUyMCUzRCUyMCUyMmltcG9ydCUyMHBhbmRhcyUyMGFzJTIwcGQlMjIlMEElMEFwcmludCglMEElMjAlMjAlMjAlMjBhbnlfa2V5d29yZF9pbl9zdHJpbmcoZXhhbXBsZV8xJTJDJTIwZmlsdGVycyklMkMlMjBhbnlfa2V5d29yZF9pbl9zdHJpbmcoZXhhbXBsZV8yJTJDJTIwZmlsdGVycyklMEEp",highlighted:`filters = [<span class="hljs-string">&quot;pandas&quot;</span>, <span class="hljs-string">&quot;sklearn&quot;</span>, <span class="hljs-string">&quot;matplotlib&quot;</span>, <span class="hljs-string">&quot;seaborn&quot;</span>]
example_1 = <span class="hljs-string">&quot;import numpy as np&quot;</span>
example_2 = <span class="hljs-string">&quot;import pandas as pd&quot;</span>

<span class="hljs-built_in">print</span>(
    any_keyword_in_string(example_1, filters), any_keyword_in_string(example_2, filters)
)`,wrap:!1}}),H=new C({props:{code:"RmFsc2UlMjBUcnVl",highlighted:'<span class="hljs-literal">False</span> <span class="hljs-literal">True</span>',wrap:!1}}),S=new C({props:{code:"ZnJvbSUyMGNvbGxlY3Rpb25zJTIwaW1wb3J0JTIwZGVmYXVsdGRpY3QlMEFmcm9tJTIwdHFkbSUyMGltcG9ydCUyMHRxZG0lMEFmcm9tJTIwZGF0YXNldHMlMjBpbXBvcnQlMjBEYXRhc2V0JTBBJTBBJTBBZGVmJTIwZmlsdGVyX3N0cmVhbWluZ19kYXRhc2V0KGRhdGFzZXQlMkMlMjBmaWx0ZXJzKSUzQSUwQSUyMCUyMCUyMCUyMGZpbHRlcmVkX2RpY3QlMjAlM0QlMjBkZWZhdWx0ZGljdChsaXN0KSUwQSUyMCUyMCUyMCUyMHRvdGFsJTIwJTNEJTIwMCUwQSUyMCUyMCUyMCUyMGZvciUyMHNhbXBsZSUyMGluJTIwdHFkbShpdGVyKGRhdGFzZXQpKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRvdGFsJTIwJTJCJTNEJTIwMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwYW55X2tleXdvcmRfaW5fc3RyaW5nKHNhbXBsZSU1QiUyMmNvbnRlbnQlMjIlNUQlMkMlMjBmaWx0ZXJzKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGslMkMlMjB2JTIwaW4lMjBzYW1wbGUuaXRlbXMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZpbHRlcmVkX2RpY3QlNUJrJTVELmFwcGVuZCh2KSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlN0JsZW4oZmlsdGVyZWRfZGljdCU1Qidjb250ZW50JyU1RCklMkZ0b3RhbCUzQS4yJTI1JTdEJTIwb2YlMjBkYXRhJTIwYWZ0ZXIlMjBmaWx0ZXJpbmcuJTIyKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMERhdGFzZXQuZnJvbV9kaWN0KGZpbHRlcmVkX2RpY3Qp",highlighted:`<span class="hljs-keyword">from</span> collections <span class="hljs-keyword">import</span> defaultdict
<span class="hljs-keyword">from</span> tqdm <span class="hljs-keyword">import</span> tqdm
<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> Dataset


<span class="hljs-keyword">def</span> <span class="hljs-title function_">filter_streaming_dataset</span>(<span class="hljs-params">dataset, filters</span>):
    filtered_dict = defaultdict(<span class="hljs-built_in">list</span>)
    total = <span class="hljs-number">0</span>
    <span class="hljs-keyword">for</span> sample <span class="hljs-keyword">in</span> tqdm(<span class="hljs-built_in">iter</span>(dataset)):
        total += <span class="hljs-number">1</span>
        <span class="hljs-keyword">if</span> any_keyword_in_string(sample[<span class="hljs-string">&quot;content&quot;</span>], filters):
            <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> sample.items():
                filtered_dict[k].append(v)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;<span class="hljs-subst">{<span class="hljs-built_in">len</span>(filtered_dict[<span class="hljs-string">&#x27;content&#x27;</span>])/total:<span class="hljs-number">.2</span>%}</span> of data after filtering.&quot;</span>)
    <span class="hljs-keyword">return</span> Dataset.from_dict(filtered_dict)`,wrap:!1}}),D=new C({props:{code:"JTIzJTIwJUQwJTkyJUQxJThCJUQwJUJGJUQwJUJFJUQwJUJCJUQwJUJEJUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQxJThEJUQxJTgyJUQwJUJFJUQwJUI5JTIwJUQxJThGJUQxJTg3JUQwJUI1JUQwJUI5JUQwJUJBJUQwJUI4JTIwJUQwJUI3JUQwJUIwJUQwJUI5JUQwJUJDJUQwJUI1JUQxJTgyJTIwJUQwJUJFJUQxJTg3JUQwJUI1JUQwJUJEJUQxJThDJTIwJUQwJUJDJUQwJUJEJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQwJUIyJUQxJTgwJUQwJUI1JUQwJUJDJUQwJUI1JUQwJUJEJUQwJUI4JTJDJTIwJUQwJUJGJUQwJUJFJUQxJThEJUQxJTgyJUQwJUJFJUQwJUJDJUQxJTgzJTIwJUQwJUI1JUQwJUI1JTIwJUQxJTgxJUQwJUJCJUQwJUI1JUQwJUI0JUQxJTgzJUQwJUI1JUQxJTgyJTIwJUQwJUJGJUQxJTgwJUQwJUJFJUQwJUJGJUQxJTgzJUQxJTgxJUQxJTgyJUQwJUI4JUQxJTgyJUQxJThDJTIwJUQwJUI4JTIwJUQwJUJGJUQwJUI1JUQxJTgwJUQwJUI1JUQwJUI5JUQxJTgyJUQwJUI4JTIwJUQwJUJBJTBBJTIzJTIwJUQxJTgxJUQwJUJCJUQwJUI1JUQwJUI0JUQxJTgzJUQxJThFJUQxJTg5JUQwJUI1JUQwJUI5ISUwQWZyb20lMjBkYXRhc2V0cyUyMGltcG9ydCUyMGxvYWRfZGF0YXNldCUwQSUwQXNwbGl0JTIwJTNEJTIwJTIydHJhaW4lMjIlMjAlMjAlMjMlMjAlMjJ2YWxpZCUyMiUwQWZpbHRlcnMlMjAlM0QlMjAlNUIlMjJwYW5kYXMlMjIlMkMlMjAlMjJza2xlYXJuJTIyJTJDJTIwJTIybWF0cGxvdGxpYiUyMiUyQyUyMCUyMnNlYWJvcm4lMjIlNUQlMEElMEFkYXRhJTIwJTNEJTIwbG9hZF9kYXRhc2V0KGYlMjJ0cmFuc2Zvcm1lcnNib29rJTJGY29kZXBhcnJvdC0lN0JzcGxpdCU3RCUyMiUyQyUyMHNwbGl0JTNEc3BsaXQlMkMlMjBzdHJlYW1pbmclM0RUcnVlKSUwQWZpbHRlcmVkX2RhdGElMjAlM0QlMjBmaWx0ZXJfc3RyZWFtaW5nX2RhdGFzZXQoZGF0YSUyQyUyMGZpbHRlcnMp",highlighted:`<span class="hljs-comment"># Выполнение этой ячейки займет очень много времени, поэтому ее следует пропустить и перейти к</span>
<span class="hljs-comment"># следующей!</span>
<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

split = <span class="hljs-string">&quot;train&quot;</span>  <span class="hljs-comment"># &quot;valid&quot;</span>
filters = [<span class="hljs-string">&quot;pandas&quot;</span>, <span class="hljs-string">&quot;sklearn&quot;</span>, <span class="hljs-string">&quot;matplotlib&quot;</span>, <span class="hljs-string">&quot;seaborn&quot;</span>]

data = load_dataset(<span class="hljs-string">f&quot;transformersbook/codeparrot-<span class="hljs-subst">{split}</span>&quot;</span>, split=split, streaming=<span class="hljs-literal">True</span>)
filtered_data = filter_streaming_dataset(data, filters)`,wrap:!1}}),q=new C({props:{code:"My4yNiUyNSUyMG9mJTIwZGF0YSUyMGFmdGVyJTIwZmlsdGVyaW5nLg==",highlighted:'<span class="hljs-number">3.26</span>% of data after filtering.',wrap:!1}}),K=new C({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTJDJTIwRGF0YXNldERpY3QlMEElMEFkc190cmFpbiUyMCUzRCUyMGxvYWRfZGF0YXNldCglMjJodWdnaW5nZmFjZS1jb3Vyc2UlMkZjb2RlcGFycm90LWRzLXRyYWluJTIyJTJDJTIwc3BsaXQlM0QlMjJ0cmFpbiUyMiklMEFkc192YWxpZCUyMCUzRCUyMGxvYWRfZGF0YXNldCglMjJodWdnaW5nZmFjZS1jb3Vyc2UlMkZjb2RlcGFycm90LWRzLXZhbGlkJTIyJTJDJTIwc3BsaXQlM0QlMjJ2YWxpZGF0aW9uJTIyKSUwQSUwQXJhd19kYXRhc2V0cyUyMCUzRCUyMERhdGFzZXREaWN0KCUwQSUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRyYWluJTIyJTNBJTIwZHNfdHJhaW4lMkMlMjAlMjAlMjMlMjAuc2h1ZmZsZSgpLnNlbGVjdChyYW5nZSg1MDAwMCkpJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydmFsaWQlMjIlM0ElMjBkc192YWxpZCUyQyUyMCUyMCUyMyUyMC5zaHVmZmxlKCkuc2VsZWN0KHJhbmdlKDUwMCkpJTBBJTIwJTIwJTIwJTIwJTdEJTBBKSUwQSUwQXJhd19kYXRhc2V0cw==",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset, DatasetDict

ds_train = load_dataset(<span class="hljs-string">&quot;huggingface-course/codeparrot-ds-train&quot;</span>, split=<span class="hljs-string">&quot;train&quot;</span>)
ds_valid = load_dataset(<span class="hljs-string">&quot;huggingface-course/codeparrot-ds-valid&quot;</span>, split=<span class="hljs-string">&quot;validation&quot;</span>)

raw_datasets = DatasetDict(
    {
        <span class="hljs-string">&quot;train&quot;</span>: ds_train,  <span class="hljs-comment"># .shuffle().select(range(50000)),</span>
        <span class="hljs-string">&quot;valid&quot;</span>: ds_valid,  <span class="hljs-comment"># .shuffle().select(range(500))</span>
    }
)

raw_datasets`,wrap:!1}}),P=new C({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ3JlcG9fbmFtZSclMkMlMjAncGF0aCclMkMlMjAnY29waWVzJyUyQyUyMCdzaXplJyUyQyUyMCdjb250ZW50JyUyQyUyMCdsaWNlbnNlJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNjA2NzIwJTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHZhbGlkJTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidyZXBvX25hbWUnJTJDJTIwJ3BhdGgnJTJDJTIwJ2NvcGllcyclMkMlMjAnc2l6ZSclMkMlMjAnY29udGVudCclMkMlMjAnbGljZW5zZSclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDMzMjIlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;repo_name&#x27;</span>, <span class="hljs-string">&#x27;path&#x27;</span>, <span class="hljs-string">&#x27;copies&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;content&#x27;</span>, <span class="hljs-string">&#x27;license&#x27;</span>],
        num_rows: <span class="hljs-number">606720</span>
    })
    valid: Dataset({
        features: [<span class="hljs-string">&#x27;repo_name&#x27;</span>, <span class="hljs-string">&#x27;path&#x27;</span>, <span class="hljs-string">&#x27;copies&#x27;</span>, <span class="hljs-string">&#x27;size&#x27;</span>, <span class="hljs-string">&#x27;content&#x27;</span>, <span class="hljs-string">&#x27;license&#x27;</span>],
        num_rows: <span class="hljs-number">3322</span>
    })
})`,wrap:!1}}),W=new ys({props:{$$slots:{default:[ua]},$$scope:{ctx:h}}}),O=new C({props:{code:"Zm9yJTIwa2V5JTIwaW4lMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjAlNUQlM0ElMEElMjAlMjAlMjAlMjBwcmludChmJTIyJTdCa2V5LnVwcGVyKCklN0QlM0ElMjAlN0JyYXdfZGF0YXNldHMlNUIndHJhaW4nJTVEJTVCMCU1RCU1QmtleSU1RCU1QiUzQTIwMCU1RCU3RCUyMik=",highlighted:`<span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>]:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;<span class="hljs-subst">{key.upper()}</span>: <span class="hljs-subst">{raw_datasets[<span class="hljs-string">&#x27;train&#x27;</span>][<span class="hljs-number">0</span>][key][:<span class="hljs-number">200</span>]}</span>&quot;</span>)`,wrap:!1}}),rl=new C({props:{code:"J1JFUE9fTkFNRSUzQSUyMGttaWtlJTJGc2Npa2l0LWxlYXJuJyUwQSdQQVRIJTNBJTIwc2tsZWFybiUyRnV0aWxzJTJGX19pbml0X18ucHknJTBBJ0NPUElFUyUzQSUyMDMnJTBBJ1NJWkUlM0ElMjAxMDA5NCclMEEnJydDT05URU5UJTNBJTIwJTIyJTIyJTIyJTBBVGhlJTIwJTNBbW9kJTNBJTYwc2tsZWFybi51dGlscyU2MCUyMG1vZHVsZSUyMGluY2x1ZGVzJTIwdmFyaW91cyUyMHV0aWxpdGVzLiUwQSUyMiUyMiUyMiUwQSUwQWZyb20lMjBjb2xsZWN0aW9ucyUyMGltcG9ydCUyMFNlcXVlbmNlJTBBJTBBaW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBZnJvbSUyMHNjaXB5LnNwYXJzZSUyMGltcG9ydCUyMGlzc3BhcnNlJTBBaW1wb3J0JTIwd2FybmluZ3MlMEElMEFmcm9tJTIwLm11cm11cmhhc2glMjBpbXBvcnQlMjBtdXJtJTBBTElDRU5TRSUzQSUyMGJzZC0zLWNsYXVzZScnJw==",highlighted:`<span class="hljs-string">&#x27;REPO_NAME: kmike/scikit-learn&#x27;</span>
<span class="hljs-string">&#x27;PATH: sklearn/utils/__init__.py&#x27;</span>
<span class="hljs-string">&#x27;COPIES: 3&#x27;</span>
<span class="hljs-string">&#x27;SIZE: 10094&#x27;</span>
<span class="hljs-string">&#x27;&#x27;&#x27;CONTENT: &quot;&quot;&quot;
The :mod:\`sklearn.utils\` module includes various utilites.
&quot;&quot;&quot;

from collections import Sequence

import numpy as np
from scipy.sparse import issparse
import warnings

from .murmurhash import murm
LICENSE: bsd-3-clause&#x27;&#x27;&#x27;</span>`,wrap:!1}}),cl=new je({props:{title:"Подготовка датасета",local:"preparing-the-dataset",headingTag:"h2"}}),il=new dt({props:{id:"ma1TrR7gE7I"}}),w=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFjb250ZXh0X2xlbmd0aCUyMCUzRCUyMDEyOCUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRmNvZGUtc2VhcmNoLW5ldC10b2tlbml6ZXIlMjIpJTBBJTBBb3V0cHV0cyUyMCUzRCUyMHRva2VuaXplciglMEElMjAlMjAlMjAlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QiUzQTIlNUQlNUIlMjJjb250ZW50JTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBtYXhfbGVuZ3RoJTNEY29udGV4dF9sZW5ndGglMkMlMEElMjAlMjAlMjAlMjByZXR1cm5fb3ZlcmZsb3dpbmdfdG9rZW5zJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMHJldHVybl9sZW5ndGglM0RUcnVlJTJDJTBBKSUwQSUwQXByaW50KGYlMjJJbnB1dCUyMElEcyUyMGxlbmd0aCUzQSUyMCU3QmxlbihvdXRwdXRzJTVCJ2lucHV0X2lkcyclNUQpJTdEJTIyKSUwQXByaW50KGYlMjJJbnB1dCUyMGNodW5rJTIwbGVuZ3RocyUzQSUyMCU3QihvdXRwdXRzJTVCJ2xlbmd0aCclNUQpJTdEJTIyKSUwQXByaW50KGYlMjJDaHVuayUyMG1hcHBpbmclM0ElMjAlN0JvdXRwdXRzJTVCJ292ZXJmbG93X3RvX3NhbXBsZV9tYXBwaW5nJyU1RCU3RCUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

context_length = <span class="hljs-number">128</span>
tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">&quot;huggingface-course/code-search-net-tokenizer&quot;</span>)

outputs = tokenizer(
    raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][:<span class="hljs-number">2</span>][<span class="hljs-string">&quot;content&quot;</span>],
    truncation=<span class="hljs-literal">True</span>,
    max_length=context_length,
    return_overflowing_tokens=<span class="hljs-literal">True</span>,
    return_length=<span class="hljs-literal">True</span>,
)

<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Input IDs length: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(outputs[<span class="hljs-string">&#x27;input_ids&#x27;</span>])}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Input chunk lengths: <span class="hljs-subst">{(outputs[<span class="hljs-string">&#x27;length&#x27;</span>])}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Chunk mapping: <span class="hljs-subst">{outputs[<span class="hljs-string">&#x27;overflow_to_sample_mapping&#x27;</span>]}</span>&quot;</span>)`,wrap:!1}}),hs=new C({props:{code:"SW5wdXQlMjBJRHMlMjBsZW5ndGglM0ElMjAzNCUwQUlucHV0JTIwY2h1bmslMjBsZW5ndGhzJTNBJTIwJTVCMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTE3JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwMTI4JTJDJTIwNDElNUQlMEFDaHVuayUyMG1hcHBpbmclM0ElMjAlNUIwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTVE",highlighted:`Input IDs length: <span class="hljs-number">34</span>
Input chunk lengths: [<span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">117</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">128</span>, <span class="hljs-number">41</span>]
Chunk mapping: [<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>]`,wrap:!1}}),ks=new C({props:{code:"ZGVmJTIwdG9rZW5pemUoZWxlbWVudCklM0ElMEElMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsZW1lbnQlNUIlMjJjb250ZW50JTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtYXhfbGVuZ3RoJTNEY29udGV4dF9sZW5ndGglMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm5fb3ZlcmZsb3dpbmdfdG9rZW5zJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybl9sZW5ndGglM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMGlucHV0X2JhdGNoJTIwJTNEJTIwJTVCJTVEJTBBJTIwJTIwJTIwJTIwZm9yJTIwbGVuZ3RoJTJDJTIwaW5wdXRfaWRzJTIwaW4lMjB6aXAob3V0cHV0cyU1QiUyMmxlbmd0aCUyMiU1RCUyQyUyMG91dHB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBsZW5ndGglMjAlM0QlM0QlMjBjb250ZXh0X2xlbmd0aCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0X2JhdGNoLmFwcGVuZChpbnB1dF9pZHMpJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCJTIyaW5wdXRfaWRzJTIyJTNBJTIwaW5wdXRfYmF0Y2glN0QlMEElMEElMEF0b2tlbml6ZWRfZGF0YXNldHMlMjAlM0QlMjByYXdfZGF0YXNldHMubWFwKCUwQSUyMCUyMCUyMCUyMHRva2VuaXplJTJDJTIwYmF0Y2hlZCUzRFRydWUlMkMlMjByZW1vdmVfY29sdW1ucyUzRHJhd19kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELmNvbHVtbl9uYW1lcyUwQSklMEF0b2tlbml6ZWRfZGF0YXNldHM=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize</span>(<span class="hljs-params">element</span>):
    outputs = tokenizer(
        element[<span class="hljs-string">&quot;content&quot;</span>],
        truncation=<span class="hljs-literal">True</span>,
        max_length=context_length,
        return_overflowing_tokens=<span class="hljs-literal">True</span>,
        return_length=<span class="hljs-literal">True</span>,
    )
    input_batch = []
    <span class="hljs-keyword">for</span> length, input_ids <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(outputs[<span class="hljs-string">&quot;length&quot;</span>], outputs[<span class="hljs-string">&quot;input_ids&quot;</span>]):
        <span class="hljs-keyword">if</span> length == context_length:
            input_batch.append(input_ids)
    <span class="hljs-keyword">return</span> {<span class="hljs-string">&quot;input_ids&quot;</span>: input_batch}


tokenized_datasets = raw_datasets.<span class="hljs-built_in">map</span>(
    tokenize, batched=<span class="hljs-literal">True</span>, remove_columns=raw_datasets[<span class="hljs-string">&quot;train&quot;</span>].column_names
)
tokenized_datasets`,wrap:!1}}),Zs=new C({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2lucHV0X2lkcyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE2NzAyMDYxJTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHZhbGlkJTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidpbnB1dF9pZHMnJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjA5MzE2NCUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;input_ids&#x27;</span>],
        num_rows: <span class="hljs-number">16702061</span>
    })
    valid: Dataset({
        features: [<span class="hljs-string">&#x27;input_ids&#x27;</span>],
        num_rows: <span class="hljs-number">93164</span>
    })
})`,wrap:!1}}),ns=new ys({props:{$$slots:{default:[da]},$$scope:{ctx:h}}}),Gs=new je({props:{title:"Инициализация новой модели",local:"initializing-a-new-model",headingTag:"h2"}});const zt=[Ia,ja],pe=[];function xt(l,p){return l[0]==="pt"?0:1}ul=xt(h),dl=pe[ul]=zt[ul](h);const Nt=[ba,fa],Me=[];function At(l,p){return l[0]==="pt"?0:1}jl=At(h),Il=Me[jl]=Nt[jl](h),Es=new C({props:{code:"b3V0JTIwJTNEJTIwZGF0YV9jb2xsYXRvciglNUJ0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QmklNUQlMjBmb3IlMjBpJTIwaW4lMjByYW5nZSg1KSU1RCklMEFmb3IlMjBrZXklMjBpbiUyMG91dCUzQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlN0JrZXklN0QlMjBzaGFwZSUzQSUyMCU3Qm91dCU1QmtleSU1RC5zaGFwZSU3RCUyMik=",highlighted:`out = data_collator([tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>)])
<span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> out:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;<span class="hljs-subst">{key}</span> shape: <span class="hljs-subst">{out[key].shape}</span>&quot;</span>)`,wrap:!1}});const vt=[ha,Ca],Je=[];function Ft(l,p){return l[0]==="pt"?0:1}fl=Ft(h),bl=Je[fl]=vt[fl](h);let X=h[0]==="tf"&&ta();ps=new ys({props:{warning:!0,$$slots:{default:[_a]},$$scope:{ctx:h}}}),xs=new C({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),vs=new C({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}});const Yt=[ka,Qa],re=[];function Ht(l,p){return l[0]==="pt"?0:1}Cl=Ht(h),hl=re[Cl]=Yt[Cl](h),Ms=new ys({props:{$$slots:{default:[Za]},$$scope:{ctx:h}}}),Js=new ys({props:{$$slots:{default:[Ga]},$$scope:{ctx:h}}}),Fs=new je({props:{title:"Генерация кода с помощью конвейера",local:"code-generation-with-a-pipeline",headingTag:"h2"}});const St=[Ba,Ra],Ue=[];function Dt(l,p){return l[0]==="pt"?0:1}_l=Dt(h),Ql=Ue[_l]=St[_l](h),Ss=new C({props:{code:"dHh0JTIwJTNEJTIwJTIyJTIyJTIyJTVDJTBBJTIzJTIwY3JlYXRlJTIwc29tZSUyMGRhdGElMEF4JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEF5JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEElMEElMjMlMjBjcmVhdGUlMjBzY2F0dGVyJTIwcGxvdCUyMHdpdGglMjB4JTJDJTIweSUwQSUyMiUyMiUyMiUwQXByaW50KHBpcGUodHh0JTJDJTIwbnVtX3JldHVybl9zZXF1ZW5jZXMlM0QxKSU1QjAlNUQlNUIlMjJnZW5lcmF0ZWRfdGV4dCUyMiU1RCk=",highlighted:`txt = <span class="hljs-string">&quot;&quot;&quot;\\
# create some data
x = np.random.randn(100)
y = np.random.randn(100)

# create scatter plot with x, y
&quot;&quot;&quot;</span>
<span class="hljs-built_in">print</span>(pipe(txt, num_return_sequences=<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;generated_text&quot;</span>])`,wrap:!1}}),Ds=new C({props:{code:"JTIzJTIwY3JlYXRlJTIwc29tZSUyMGRhdGElMEF4JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEF5JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEElMEElMjMlMjBjcmVhdGUlMjBzY2F0dGVyJTIwcGxvdCUyMHdpdGglMjB4JTJDJTIweSUwQXBsdC5zY2F0dGVyKHglMkMlMjB5KSUwQSUwQSUyMyUyMGNyZWF0ZSUyMHNjYXR0ZXI=",highlighted:`<span class="hljs-comment"># create some data</span>
x = np.random.randn(<span class="hljs-number">100</span>)
y = np.random.randn(<span class="hljs-number">100</span>)

<span class="hljs-comment"># create scatter plot with x, y</span>
plt.scatter(x, y)

<span class="hljs-comment"># create scatter</span>`,wrap:!1}}),Ls=new C({props:{code:"dHh0JTIwJTNEJTIwJTIyJTIyJTIyJTVDJTBBJTIzJTIwY3JlYXRlJTIwc29tZSUyMGRhdGElMEF4JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEF5JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEElMEElMjMlMjBjcmVhdGUlMjBkYXRhZnJhbWUlMjBmcm9tJTIweCUyMGFuZCUyMHklMEElMjIlMjIlMjIlMEFwcmludChwaXBlKHR4dCUyQyUyMG51bV9yZXR1cm5fc2VxdWVuY2VzJTNEMSklNUIwJTVEJTVCJTIyZ2VuZXJhdGVkX3RleHQlMjIlNUQp",highlighted:`txt = <span class="hljs-string">&quot;&quot;&quot;\\
# create some data
x = np.random.randn(100)
y = np.random.randn(100)

# create dataframe from x and y
&quot;&quot;&quot;</span>
<span class="hljs-built_in">print</span>(pipe(txt, num_return_sequences=<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;generated_text&quot;</span>])`,wrap:!1}}),Ks=new C({props:{code:"JTIzJTIwY3JlYXRlJTIwc29tZSUyMGRhdGElMEF4JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEF5JTIwJTNEJTIwbnAucmFuZG9tLnJhbmRuKDEwMCklMEElMEElMjMlMjBjcmVhdGUlMjBkYXRhZnJhbWUlMjBmcm9tJTIweCUyMGFuZCUyMHklMEFkZiUyMCUzRCUyMHBkLkRhdGFGcmFtZSglN0IneCclM0ElMjB4JTJDJTIwJ3knJTNBJTIweSU3RCklMEFkZi5pbnNlcnQoMCUyQyd4JyUyQyUyMHgpJTBBZm9y",highlighted:`<span class="hljs-comment"># create some data</span>
x = np.random.randn(<span class="hljs-number">100</span>)
y = np.random.randn(<span class="hljs-number">100</span>)

<span class="hljs-comment"># create dataframe from x and y</span>
df = pd.DataFrame({<span class="hljs-string">&#x27;x&#x27;</span>: x, <span class="hljs-string">&#x27;y&#x27;</span>: y})
df.insert(<span class="hljs-number">0</span>,<span class="hljs-string">&#x27;x&#x27;</span>, x)
<span class="hljs-keyword">for</span>`,wrap:!1}}),Os=new C({props:{code:"dHh0JTIwJTNEJTIwJTIyJTIyJTIyJTVDJTBBJTIzJTIwZGF0YWZyYW1lJTIwd2l0aCUyMHByb2Zlc3Npb24lMkMlMjBpbmNvbWUlMjBhbmQlMjBuYW1lJTBBZGYlMjAlM0QlMjBwZC5EYXRhRnJhbWUoJTdCJ3Byb2Zlc3Npb24nJTNBJTIweCUyQyUyMCdpbmNvbWUnJTNBeSUyQyUyMCduYW1lJyUzQSUyMHolN0QpJTBBJTBBJTIzJTIwY2FsY3VsYXRlJTIwdGhlJTIwbWVhbiUyMGluY29tZSUyMHBlciUyMHByb2Zlc3Npb24lMEElMjIlMjIlMjIlMEFwcmludChwaXBlKHR4dCUyQyUyMG51bV9yZXR1cm5fc2VxdWVuY2VzJTNEMSklNUIwJTVEJTVCJTIyZ2VuZXJhdGVkX3RleHQlMjIlNUQp",highlighted:`txt = <span class="hljs-string">&quot;&quot;&quot;\\
# dataframe with profession, income and name
df = pd.DataFrame({&#x27;profession&#x27;: x, &#x27;income&#x27;:y, &#x27;name&#x27;: z})

# calculate the mean income per profession
&quot;&quot;&quot;</span>
<span class="hljs-built_in">print</span>(pipe(txt, num_return_sequences=<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;generated_text&quot;</span>])`,wrap:!1}}),le=new C({props:{code:"JTIzJTIwZGF0YWZyYW1lJTIwd2l0aCUyMHByb2Zlc3Npb24lMkMlMjBpbmNvbWUlMjBhbmQlMjBuYW1lJTBBZGYlMjAlM0QlMjBwZC5EYXRhRnJhbWUoJTdCJ3Byb2Zlc3Npb24nJTNBJTIweCUyQyUyMCdpbmNvbWUnJTNBeSUyQyUyMCduYW1lJyUzQSUyMHolN0QpJTBBJTBBJTIzJTIwY2FsY3VsYXRlJTIwdGhlJTIwbWVhbiUyMGluY29tZSUyMHBlciUyMHByb2Zlc3Npb24lMEFwcm9mZXNzaW9uJTIwJTNEJTIwZGYuZ3JvdXBieSglNUIncHJvZmVzc2lvbiclNUQpLm1lYW4oKSUwQSUwQSUyMyUyMGNvbXB1dGUlMjB0aGU=",highlighted:`<span class="hljs-comment"># dataframe with profession, income and name</span>
df = pd.DataFrame({<span class="hljs-string">&#x27;profession&#x27;</span>: x, <span class="hljs-string">&#x27;income&#x27;</span>:y, <span class="hljs-string">&#x27;name&#x27;</span>: z})

<span class="hljs-comment"># calculate the mean income per profession</span>
profession = df.groupby([<span class="hljs-string">&#x27;profession&#x27;</span>]).mean()

<span class="hljs-comment"># compute the</span>`,wrap:!1}}),ee=new C({props:{code:"dHh0JTIwJTNEJTIwJTIyJTIyJTIyJTBBJTIzJTIwaW1wb3J0JTIwcmFuZG9tJTIwZm9yZXN0JTIwcmVncmVzc29yJTIwZnJvbSUyMHNjaWtpdC1sZWFybiUwQWZyb20lMjBza2xlYXJuLmVuc2VtYmxlJTIwaW1wb3J0JTIwUmFuZG9tRm9yZXN0UmVncmVzc29yJTBBJTBBJTIzJTIwZml0JTIwcmFuZG9tJTIwZm9yZXN0JTIwbW9kZWwlMjB3aXRoJTIwMzAwJTIwZXN0aW1hdG9ycyUyMG9uJTIwWCUyQyUyMHklM0ElMEElMjIlMjIlMjIlMEFwcmludChwaXBlKHR4dCUyQyUyMG51bV9yZXR1cm5fc2VxdWVuY2VzJTNEMSklNUIwJTVEJTVCJTIyZ2VuZXJhdGVkX3RleHQlMjIlNUQp",highlighted:`txt = <span class="hljs-string">&quot;&quot;&quot;
# import random forest regressor from scikit-learn
from sklearn.ensemble import RandomForestRegressor

# fit random forest model with 300 estimators on X, y:
&quot;&quot;&quot;</span>
<span class="hljs-built_in">print</span>(pipe(txt, num_return_sequences=<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">&quot;generated_text&quot;</span>])`,wrap:!1}}),te=new C({props:{code:"JTIzJTIwaW1wb3J0JTIwcmFuZG9tJTIwZm9yZXN0JTIwcmVncmVzc29yJTIwZnJvbSUyMHNjaWtpdC1sZWFybiUwQWZyb20lMjBza2xlYXJuLmVuc2VtYmxlJTIwaW1wb3J0JTIwUmFuZG9tRm9yZXN0UmVncmVzc29yJTBBJTBBJTIzJTIwZml0JTIwcmFuZG9tJTIwZm9yZXN0JTIwbW9kZWwlMjB3aXRoJTIwMzAwJTIwZXN0aW1hdG9ycyUyMG9uJTIwWCUyQyUyMHklM0ElMEFyZiUyMCUzRCUyMFJhbmRvbUZvcmVzdFJlZ3Jlc3NvcihuX2VzdGltYXRvcnMlM0QzMDAlMkMlMjByYW5kb21fc3RhdGUlM0RyYW5kb21fc3RhdGUlMkMlMjBtYXhfZGVwdGglM0QzKSUwQXJmLmZpdChYJTJDJTIweSklMEFyZg==",highlighted:`<span class="hljs-comment"># import random forest regressor from scikit-learn</span>
<span class="hljs-keyword">from</span> sklearn.ensemble <span class="hljs-keyword">import</span> RandomForestRegressor

<span class="hljs-comment"># fit random forest model with 300 estimators on X, y:</span>
rf = RandomForestRegressor(n_estimators=<span class="hljs-number">300</span>, random_state=random_state, max_depth=<span class="hljs-number">3</span>)
rf.fit(X, y)
rf`,wrap:!1}});function qt(l,p){return l[0]==="tf"?Va:Xa}let yt=qt(h),as=yt(h),V=h[0]==="pt"&&aa(h);return ae=new ia({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter7/6.mdx"}}),{c(){t=d("meta"),r=M(),n=d("p"),c=M(),i(_.$$.fragment),b=M(),i($.$$.fragment),k=M(),i(Z.$$.fragment),u=M(),g.c(),B=M(),R=d("p"),R.innerHTML=z,Q=M(),G=d("p"),G.innerHTML=kl,Al=M(),i(x.$$.fragment),cs=M(),el=d("p"),el.innerHTML=Zl,ws=M(),E=d("iframe"),is=M(),tl=d("p"),tl.innerHTML=gl,vl=M(),i(N.$$.fragment),Ts=M(),al=d("p"),al.innerHTML=Gl,Fl=M(),A=d("p"),A.innerHTML=Ie,Yl=M(),i(v.$$.fragment),Hl=M(),F=d("p"),F.textContent=fe,Sl=M(),i(Y.$$.fragment),Dl=M(),i(H.$$.fragment),ms=M(),nl=d("p"),nl.textContent=Rl,ql=M(),i(S.$$.fragment),os=M(),pl=d("p"),pl.textContent=Bl,Ll=M(),i(D.$$.fragment),Kl=M(),i(q.$$.fragment),us=M(),Ml=d("p"),Ml.textContent=Xl,Pl=M(),L=d("p"),L.textContent=be,Ol=M(),i(K.$$.fragment),ls=M(),i(P.$$.fragment),ss=M(),i(W.$$.fragment),ds=M(),Jl=d("p"),Jl.textContent=Vl,es=M(),i(O.$$.fragment),js=M(),i(rl.$$.fragment),Ul=M(),El=d("p"),El.innerHTML=Is,yl=M(),i(cl.$$.fragment),wl=M(),i(il.$$.fragment),Tl=M(),Wl=d("p"),Wl.textContent=fs,ml=M(),ol=d("p"),ol.innerHTML=zl,bs=M(),sl=d("div"),sl.innerHTML=xl,ts=M(),ll=d("p"),ll.textContent=Cs,s=M(),i(w.$$.fragment),he=M(),i(hs.$$.fragment),_e=M(),_s=d("p"),_s.innerHTML=jt,Qe=M(),Qs=d("p"),Qs.innerHTML=It,ke=M(),i(ks.$$.fragment),Ze=M(),i(Zs.$$.fragment),$e=M(),$s=d("p"),$s.textContent=ft,ge=M(),gs=d("p"),gs.textContent=bt,Ge=M(),i(ns.$$.fragment),Re=M(),i(Gs.$$.fragment),Be=M(),Rs=d("p"),Rs.innerHTML=Ct,Xe=M(),dl.c(),ce=M(),Bs=d("p"),Bs.innerHTML=ht,Ve=M(),Xs=d("p"),Xs.innerHTML=_t,Ee=M(),Il.c(),we=M(),Vs=d("p"),Vs.textContent=Qt,We=M(),i(Es.$$.fragment),ze=M(),bl.c(),ie=M(),Ws=d("p"),Ws.textContent=kt,xe=M(),X&&X.c(),Te=M(),i(ps.$$.fragment),Ne=M(),zs=d("p"),zs.textContent=Zt,Ae=M(),i(xs.$$.fragment),ve=M(),Ns=d("p"),Ns.textContent=$t,Fe=M(),As=d("p"),As.textContent=gt,Ye=M(),i(vs.$$.fragment),He=M(),hl.c(),me=M(),i(Ms.$$.fragment),Se=M(),i(Js.$$.fragment),De=M(),i(Fs.$$.fragment),qe=M(),Ys=d("p"),Ys.innerHTML=Gt,Le=M(),Ql.c(),oe=M(),Hs=d("p"),Hs.textContent=Rt,Ke=M(),i(Ss.$$.fragment),Pe=M(),i(Ds.$$.fragment),Oe=M(),qs=d("p"),qs.innerHTML=Bt,lt=M(),i(Ls.$$.fragment),st=M(),i(Ks.$$.fragment),et=M(),Ps=d("p"),Ps.innerHTML=Xt,tt=M(),i(Os.$$.fragment),at=M(),i(le.$$.fragment),nt=M(),se=d("p"),se.innerHTML=Vt,pt=M(),i(ee.$$.fragment),Mt=M(),i(te.$$.fragment),Jt=M(),as.c(),ue=M(),V&&V.c(),de=M(),i(ae.$$.fragment),rt=M(),Ce=d("p"),this.h()},l(l){const p=ya("svelte-u9bgzb",document.head);t=j(p,"META",{name:!0,content:!0}),p.forEach(e),r=J(l),n=j(l,"P",{}),ut(n).forEach(e),c=J(l),T(_.$$.fragment,l),b=J(l),T($.$$.fragment,l),k=J(l),T(Z.$$.fragment,l),u=J(l),g.l(l),B=J(l),R=j(l,"P",{"data-svelte-h":!0}),I(R)!=="svelte-1uelaml"&&(R.innerHTML=z),Q=J(l),G=j(l,"P",{"data-svelte-h":!0}),I(G)!=="svelte-cflxrq"&&(G.innerHTML=kl),Al=J(l),T(x.$$.fragment,l),cs=J(l),el=j(l,"P",{"data-svelte-h":!0}),I(el)!=="svelte-4psxaz"&&(el.innerHTML=Zl),ws=J(l),E=j(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),ut(E).forEach(e),is=J(l),tl=j(l,"P",{"data-svelte-h":!0}),I(tl)!=="svelte-1c4p2fd"&&(tl.innerHTML=gl),vl=J(l),T(N.$$.fragment,l),Ts=J(l),al=j(l,"P",{"data-svelte-h":!0}),I(al)!=="svelte-gpod5f"&&(al.innerHTML=Gl),Fl=J(l),A=j(l,"P",{"data-svelte-h":!0}),I(A)!=="svelte-18hyv4k"&&(A.innerHTML=Ie),Yl=J(l),T(v.$$.fragment,l),Hl=J(l),F=j(l,"P",{"data-svelte-h":!0}),I(F)!=="svelte-109igmr"&&(F.textContent=fe),Sl=J(l),T(Y.$$.fragment,l),Dl=J(l),T(H.$$.fragment,l),ms=J(l),nl=j(l,"P",{"data-svelte-h":!0}),I(nl)!=="svelte-1uofrb3"&&(nl.textContent=Rl),ql=J(l),T(S.$$.fragment,l),os=J(l),pl=j(l,"P",{"data-svelte-h":!0}),I(pl)!=="svelte-227v8"&&(pl.textContent=Bl),Ll=J(l),T(D.$$.fragment,l),Kl=J(l),T(q.$$.fragment,l),us=J(l),Ml=j(l,"P",{"data-svelte-h":!0}),I(Ml)!=="svelte-1osjl3a"&&(Ml.textContent=Xl),Pl=J(l),L=j(l,"P",{"data-svelte-h":!0}),I(L)!=="svelte-c5gf8x"&&(L.textContent=be),Ol=J(l),T(K.$$.fragment,l),ls=J(l),T(P.$$.fragment,l),ss=J(l),T(W.$$.fragment,l),ds=J(l),Jl=j(l,"P",{"data-svelte-h":!0}),I(Jl)!=="svelte-d3tag1"&&(Jl.textContent=Vl),es=J(l),T(O.$$.fragment,l),js=J(l),T(rl.$$.fragment,l),Ul=J(l),El=j(l,"P",{"data-svelte-h":!0}),I(El)!=="svelte-1j5tv7q"&&(El.innerHTML=Is),yl=J(l),T(cl.$$.fragment,l),wl=J(l),T(il.$$.fragment,l),Tl=J(l),Wl=j(l,"P",{"data-svelte-h":!0}),I(Wl)!=="svelte-1to6yuc"&&(Wl.textContent=fs),ml=J(l),ol=j(l,"P",{"data-svelte-h":!0}),I(ol)!=="svelte-1e7bwaz"&&(ol.innerHTML=zl),bs=J(l),sl=j(l,"DIV",{class:!0,"data-svelte-h":!0}),I(sl)!=="svelte-1mf8pz"&&(sl.innerHTML=xl),ts=J(l),ll=j(l,"P",{"data-svelte-h":!0}),I(ll)!=="svelte-xk48ej"&&(ll.textContent=Cs),s=J(l),T(w.$$.fragment,l),he=J(l),T(hs.$$.fragment,l),_e=J(l),_s=j(l,"P",{"data-svelte-h":!0}),I(_s)!=="svelte-wsek5w"&&(_s.innerHTML=jt),Qe=J(l),Qs=j(l,"P",{"data-svelte-h":!0}),I(Qs)!=="svelte-k7bti0"&&(Qs.innerHTML=It),ke=J(l),T(ks.$$.fragment,l),Ze=J(l),T(Zs.$$.fragment,l),$e=J(l),$s=j(l,"P",{"data-svelte-h":!0}),I($s)!=="svelte-qsnago"&&($s.textContent=ft),ge=J(l),gs=j(l,"P",{"data-svelte-h":!0}),I(gs)!=="svelte-30xktt"&&(gs.textContent=bt),Ge=J(l),T(ns.$$.fragment,l),Re=J(l),T(Gs.$$.fragment,l),Be=J(l),Rs=j(l,"P",{"data-svelte-h":!0}),I(Rs)!=="svelte-1ygt6px"&&(Rs.innerHTML=Ct),Xe=J(l),dl.l(l),ce=J(l),Bs=j(l,"P",{"data-svelte-h":!0}),I(Bs)!=="svelte-wv1fb9"&&(Bs.innerHTML=ht),Ve=J(l),Xs=j(l,"P",{"data-svelte-h":!0}),I(Xs)!=="svelte-lbodi4"&&(Xs.innerHTML=_t),Ee=J(l),Il.l(l),we=J(l),Vs=j(l,"P",{"data-svelte-h":!0}),I(Vs)!=="svelte-77upt7"&&(Vs.textContent=Qt),We=J(l),T(Es.$$.fragment,l),ze=J(l),bl.l(l),ie=J(l),Ws=j(l,"P",{"data-svelte-h":!0}),I(Ws)!=="svelte-18sx3mk"&&(Ws.textContent=kt),xe=J(l),X&&X.l(l),Te=J(l),T(ps.$$.fragment,l),Ne=J(l),zs=j(l,"P",{"data-svelte-h":!0}),I(zs)!=="svelte-1y2ahhd"&&(zs.textContent=Zt),Ae=J(l),T(xs.$$.fragment,l),ve=J(l),Ns=j(l,"P",{"data-svelte-h":!0}),I(Ns)!=="svelte-22u5y6"&&(Ns.textContent=$t),Fe=J(l),As=j(l,"P",{"data-svelte-h":!0}),I(As)!=="svelte-4jtag1"&&(As.textContent=gt),Ye=J(l),T(vs.$$.fragment,l),He=J(l),hl.l(l),me=J(l),T(Ms.$$.fragment,l),Se=J(l),T(Js.$$.fragment,l),De=J(l),T(Fs.$$.fragment,l),qe=J(l),Ys=j(l,"P",{"data-svelte-h":!0}),I(Ys)!=="svelte-1xq48jy"&&(Ys.innerHTML=Gt),Le=J(l),Ql.l(l),oe=J(l),Hs=j(l,"P",{"data-svelte-h":!0}),I(Hs)!=="svelte-140jves"&&(Hs.textContent=Rt),Ke=J(l),T(Ss.$$.fragment,l),Pe=J(l),T(Ds.$$.fragment,l),Oe=J(l),qs=j(l,"P",{"data-svelte-h":!0}),I(qs)!=="svelte-1i6otkh"&&(qs.innerHTML=Bt),lt=J(l),T(Ls.$$.fragment,l),st=J(l),T(Ks.$$.fragment,l),et=J(l),Ps=j(l,"P",{"data-svelte-h":!0}),I(Ps)!=="svelte-1q925zu"&&(Ps.innerHTML=Xt),tt=J(l),T(Os.$$.fragment,l),at=J(l),T(le.$$.fragment,l),nt=J(l),se=j(l,"P",{"data-svelte-h":!0}),I(se)!=="svelte-1qzs7qz"&&(se.innerHTML=Vt),pt=J(l),T(ee.$$.fragment,l),Mt=J(l),T(te.$$.fragment,l),Jt=J(l),as.l(l),ue=J(l),V&&V.l(l),de=J(l),T(ae.$$.fragment,l),rt=J(l),Ce=j(l,"P",{}),ut(Ce).forEach(e),this.h()},h(){Nl(t,"name","hf:doc:metadata"),Nl(t,"content",Na),Ma(E.src,$l="https://course-demos-codeparrot-ds.hf.space")||Nl(E,"src",$l),Nl(E,"frameborder","0"),Nl(E,"height","300"),Nl(E,"title","Gradio app"),Nl(E,"class","block dark:hidden container p-0 flex-grow space-iframe"),Nl(E,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),Nl(E,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),Nl(sl,"class","flex justify-center")},m(l,p){ca(document.head,t),a(l,r,p),a(l,n,p),a(l,c,p),m(_,l,p),a(l,b,p),m($,l,p),a(l,k,p),m(Z,l,p),a(l,u,p),ne[f].m(l,p),a(l,B,p),a(l,R,p),a(l,Q,p),a(l,G,p),a(l,Al,p),m(x,l,p),a(l,cs,p),a(l,el,p),a(l,ws,p),a(l,E,p),a(l,is,p),a(l,tl,p),a(l,vl,p),m(N,l,p),a(l,Ts,p),a(l,al,p),a(l,Fl,p),a(l,A,p),a(l,Yl,p),m(v,l,p),a(l,Hl,p),a(l,F,p),a(l,Sl,p),m(Y,l,p),a(l,Dl,p),m(H,l,p),a(l,ms,p),a(l,nl,p),a(l,ql,p),m(S,l,p),a(l,os,p),a(l,pl,p),a(l,Ll,p),m(D,l,p),a(l,Kl,p),m(q,l,p),a(l,us,p),a(l,Ml,p),a(l,Pl,p),a(l,L,p),a(l,Ol,p),m(K,l,p),a(l,ls,p),m(P,l,p),a(l,ss,p),m(W,l,p),a(l,ds,p),a(l,Jl,p),a(l,es,p),m(O,l,p),a(l,js,p),m(rl,l,p),a(l,Ul,p),a(l,El,p),a(l,yl,p),m(cl,l,p),a(l,wl,p),m(il,l,p),a(l,Tl,p),a(l,Wl,p),a(l,ml,p),a(l,ol,p),a(l,bs,p),a(l,sl,p),a(l,ts,p),a(l,ll,p),a(l,s,p),m(w,l,p),a(l,he,p),m(hs,l,p),a(l,_e,p),a(l,_s,p),a(l,Qe,p),a(l,Qs,p),a(l,ke,p),m(ks,l,p),a(l,Ze,p),m(Zs,l,p),a(l,$e,p),a(l,$s,p),a(l,ge,p),a(l,gs,p),a(l,Ge,p),m(ns,l,p),a(l,Re,p),m(Gs,l,p),a(l,Be,p),a(l,Rs,p),a(l,Xe,p),pe[ul].m(l,p),a(l,ce,p),a(l,Bs,p),a(l,Ve,p),a(l,Xs,p),a(l,Ee,p),Me[jl].m(l,p),a(l,we,p),a(l,Vs,p),a(l,We,p),m(Es,l,p),a(l,ze,p),Je[fl].m(l,p),a(l,ie,p),a(l,Ws,p),a(l,xe,p),X&&X.m(l,p),a(l,Te,p),m(ps,l,p),a(l,Ne,p),a(l,zs,p),a(l,Ae,p),m(xs,l,p),a(l,ve,p),a(l,Ns,p),a(l,Fe,p),a(l,As,p),a(l,Ye,p),m(vs,l,p),a(l,He,p),re[Cl].m(l,p),a(l,me,p),m(Ms,l,p),a(l,Se,p),m(Js,l,p),a(l,De,p),m(Fs,l,p),a(l,qe,p),a(l,Ys,p),a(l,Le,p),Ue[_l].m(l,p),a(l,oe,p),a(l,Hs,p),a(l,Ke,p),m(Ss,l,p),a(l,Pe,p),m(Ds,l,p),a(l,Oe,p),a(l,qs,p),a(l,lt,p),m(Ls,l,p),a(l,st,p),m(Ks,l,p),a(l,et,p),a(l,Ps,p),a(l,tt,p),m(Os,l,p),a(l,at,p),m(le,l,p),a(l,nt,p),a(l,se,p),a(l,pt,p),m(ee,l,p),a(l,Mt,p),m(te,l,p),a(l,Jt,p),as.m(l,p),a(l,ue,p),V&&V.m(l,p),a(l,de,p),m(ae,l,p),a(l,rt,p),a(l,Ce,p),Ut=!0},p(l,[p]){const Lt={};p&1&&(Lt.fw=l[0]),_.$set(Lt);let ct=f;f=Wt(l),f!==ct&&(Us(),y(ne[ct],1,1,()=>{ne[ct]=null}),rs(),g=ne[f],g||(g=ne[f]=Et[f](l),g.c()),U(g,1),g.m(B.parentNode,B));const Kt={};p&2&&(Kt.$$scope={dirty:p,ctx:l}),W.$set(Kt);const Pt={};p&2&&(Pt.$$scope={dirty:p,ctx:l}),ns.$set(Pt);let wt=ul;ul=xt(l),ul!==wt&&(Us(),y(pe[wt],1,1,()=>{pe[wt]=null}),rs(),dl=pe[ul],dl||(dl=pe[ul]=zt[ul](l),dl.c()),U(dl,1),dl.m(ce.parentNode,ce));let it=jl;jl=At(l),jl!==it&&(Us(),y(Me[it],1,1,()=>{Me[it]=null}),rs(),Il=Me[jl],Il||(Il=Me[jl]=Nt[jl](l),Il.c()),U(Il,1),Il.m(we.parentNode,we));let Tt=fl;fl=Ft(l),fl!==Tt&&(Us(),y(Je[Tt],1,1,()=>{Je[Tt]=null}),rs(),bl=Je[fl],bl||(bl=Je[fl]=vt[fl](l),bl.c()),U(bl,1),bl.m(ie.parentNode,ie)),l[0]==="tf"?X?p&1&&U(X,1):(X=ta(),X.c(),U(X,1),X.m(Te.parentNode,Te)):X&&(Us(),y(X,1,1,()=>{X=null}),rs());const Ot={};p&2&&(Ot.$$scope={dirty:p,ctx:l}),ps.$set(Ot);let mt=Cl;Cl=Ht(l),Cl!==mt&&(Us(),y(re[mt],1,1,()=>{re[mt]=null}),rs(),hl=re[Cl],hl||(hl=re[Cl]=Yt[Cl](l),hl.c()),U(hl,1),hl.m(me.parentNode,me));const la={};p&2&&(la.$$scope={dirty:p,ctx:l}),Ms.$set(la);const sa={};p&3&&(sa.$$scope={dirty:p,ctx:l}),Js.$set(sa);let ot=_l;_l=Dt(l),_l!==ot&&(Us(),y(Ue[ot],1,1,()=>{Ue[ot]=null}),rs(),Ql=Ue[_l],Ql||(Ql=Ue[_l]=St[_l](l),Ql.c()),U(Ql,1),Ql.m(oe.parentNode,oe)),yt!==(yt=qt(l))&&(as.d(1),as=yt(l),as&&(as.c(),as.m(ue.parentNode,ue))),l[0]==="pt"?V?p&1&&U(V,1):(V=aa(l),V.c(),U(V,1),V.m(de.parentNode,de)):V&&(Us(),y(V,1,1,()=>{V=null}),rs())},i(l){Ut||(U(_.$$.fragment,l),U($.$$.fragment,l),U(Z.$$.fragment,l),U(g),U(x.$$.fragment,l),U(N.$$.fragment,l),U(v.$$.fragment,l),U(Y.$$.fragment,l),U(H.$$.fragment,l),U(S.$$.fragment,l),U(D.$$.fragment,l),U(q.$$.fragment,l),U(K.$$.fragment,l),U(P.$$.fragment,l),U(W.$$.fragment,l),U(O.$$.fragment,l),U(rl.$$.fragment,l),U(cl.$$.fragment,l),U(il.$$.fragment,l),U(w.$$.fragment,l),U(hs.$$.fragment,l),U(ks.$$.fragment,l),U(Zs.$$.fragment,l),U(ns.$$.fragment,l),U(Gs.$$.fragment,l),U(dl),U(Il),U(Es.$$.fragment,l),U(bl),U(X),U(ps.$$.fragment,l),U(xs.$$.fragment,l),U(vs.$$.fragment,l),U(hl),U(Ms.$$.fragment,l),U(Js.$$.fragment,l),U(Fs.$$.fragment,l),U(Ql),U(Ss.$$.fragment,l),U(Ds.$$.fragment,l),U(Ls.$$.fragment,l),U(Ks.$$.fragment,l),U(Os.$$.fragment,l),U(le.$$.fragment,l),U(ee.$$.fragment,l),U(te.$$.fragment,l),U(V),U(ae.$$.fragment,l),Ut=!0)},o(l){y(_.$$.fragment,l),y($.$$.fragment,l),y(Z.$$.fragment,l),y(g),y(x.$$.fragment,l),y(N.$$.fragment,l),y(v.$$.fragment,l),y(Y.$$.fragment,l),y(H.$$.fragment,l),y(S.$$.fragment,l),y(D.$$.fragment,l),y(q.$$.fragment,l),y(K.$$.fragment,l),y(P.$$.fragment,l),y(W.$$.fragment,l),y(O.$$.fragment,l),y(rl.$$.fragment,l),y(cl.$$.fragment,l),y(il.$$.fragment,l),y(w.$$.fragment,l),y(hs.$$.fragment,l),y(ks.$$.fragment,l),y(Zs.$$.fragment,l),y(ns.$$.fragment,l),y(Gs.$$.fragment,l),y(dl),y(Il),y(Es.$$.fragment,l),y(bl),y(X),y(ps.$$.fragment,l),y(xs.$$.fragment,l),y(vs.$$.fragment,l),y(hl),y(Ms.$$.fragment,l),y(Js.$$.fragment,l),y(Fs.$$.fragment,l),y(Ql),y(Ss.$$.fragment,l),y(Ds.$$.fragment,l),y(Ls.$$.fragment,l),y(Ks.$$.fragment,l),y(Os.$$.fragment,l),y(le.$$.fragment,l),y(ee.$$.fragment,l),y(te.$$.fragment,l),y(V),y(ae.$$.fragment,l),Ut=!1},d(l){l&&(e(r),e(n),e(c),e(b),e(k),e(u),e(B),e(R),e(Q),e(G),e(Al),e(cs),e(el),e(ws),e(E),e(is),e(tl),e(vl),e(Ts),e(al),e(Fl),e(A),e(Yl),e(Hl),e(F),e(Sl),e(Dl),e(ms),e(nl),e(ql),e(os),e(pl),e(Ll),e(Kl),e(us),e(Ml),e(Pl),e(L),e(Ol),e(ls),e(ss),e(ds),e(Jl),e(es),e(js),e(Ul),e(El),e(yl),e(wl),e(Tl),e(Wl),e(ml),e(ol),e(bs),e(sl),e(ts),e(ll),e(s),e(he),e(_e),e(_s),e(Qe),e(Qs),e(ke),e(Ze),e($e),e($s),e(ge),e(gs),e(Ge),e(Re),e(Be),e(Rs),e(Xe),e(ce),e(Bs),e(Ve),e(Xs),e(Ee),e(we),e(Vs),e(We),e(ze),e(ie),e(Ws),e(xe),e(Te),e(Ne),e(zs),e(Ae),e(ve),e(Ns),e(Fe),e(As),e(Ye),e(He),e(me),e(Se),e(De),e(qe),e(Ys),e(Le),e(oe),e(Hs),e(Ke),e(Pe),e(Oe),e(qs),e(lt),e(st),e(et),e(Ps),e(tt),e(at),e(nt),e(se),e(pt),e(Mt),e(Jt),e(ue),e(de),e(rt),e(Ce)),e(t),o(_,l),o($,l),o(Z,l),ne[f].d(l),o(x,l),o(N,l),o(v,l),o(Y,l),o(H,l),o(S,l),o(D,l),o(q,l),o(K,l),o(P,l),o(W,l),o(O,l),o(rl,l),o(cl,l),o(il,l),o(w,l),o(hs,l),o(ks,l),o(Zs,l),o(ns,l),o(Gs,l),pe[ul].d(l),Me[jl].d(l),o(Es,l),Je[fl].d(l),X&&X.d(l),o(ps,l),o(xs,l),o(vs,l),re[Cl].d(l),o(Ms,l),o(Js,l),o(Fs,l),Ue[_l].d(l),o(Ss,l),o(Ds,l),o(Ls,l),o(Ks,l),o(Os,l),o(le,l),o(ee,l),o(te,l),as.d(l),V&&V.d(l),o(ae,l)}}}const Na='{"title":"Обучение каузальной языковой модели с нуля","local":"training-a-causal-language-model-from-scratch","sections":[{"title":"Сбор данных","local":"gathering-the-data","sections":[],"depth":2},{"title":"Подготовка датасета","local":"preparing-the-dataset","sections":[],"depth":2},{"title":"Инициализация новой модели","local":"initializing-a-new-model","sections":[],"depth":2},{"title":"Генерация кода с помощью конвейера","local":"code-generation-with-a-pipeline","sections":[],"depth":2},{"title":"Обучение с 🤗 Accelerate","local":"training-with-accelerate","sections":[],"depth":2}],"depth":1}';function Aa(h,t,r){let n="pt";return Ja(()=>{const c=new URLSearchParams(window.location.search);r(0,n=c.get("fw")||"pt")}),[n]}class Ka extends ra{constructor(t){super(),Ua(this,t,Aa,xa,pa,{})}}export{Ka as component};
