import{s as Wa,f as Ga,o as va,n as zl}from"../chunks/scheduler.37c15a92.js";import{S as Da,i as Ha,g as c,s as n,r as m,A as Ya,h as y,f as e,c as a,j as En,u as T,x as o,k as Ql,y as za,a as s,v as w,t as U,b as Gs,d as i,w as j,p as Bs}from"../chunks/index.2bf4358c.js";import{T as le}from"../chunks/Tip.363c041f.js";import{Y as kn}from"../chunks/Youtube.1e50a667.js";import{C as h}from"../chunks/CodeBlock.4e987730.js";import{C as Xa}from"../chunks/CourseFloatingBanner.9ff4c771.js";import{F as Fa}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as Rl,E as Sa}from"../chunks/getInferenceSnippets.24b50994.js";function qa(k){let M,b;return M=new Xa({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/section4_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section4_tf.ipynb"}]}}),{c(){m(M.$$.fragment)},l(J){T(M.$$.fragment,J)},m(J,f){w(M,J,f),b=!0},i(J){b||(i(M.$$.fragment,J),b=!0)},o(J){U(M.$$.fragment,J),b=!1},d(J){j(M,J)}}}function La(k){let M,b;return M=new Xa({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/section4_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section4_pt.ipynb"}]}}),{c(){m(M.$$.fragment)},l(J){T(M.$$.fragment,J)},m(J,f){w(M,J,f),b=!0},i(J){b||(i(M.$$.fragment,J),b=!0)},o(J){U(M.$$.fragment,J),b=!1},d(J){j(M,J)}}}function Pa(k){let M,b="✏️ <strong>Попробуйте!</strong> Еще одно английское слово, которое часто используется во французском языке, - “email”. Найдите в обучающем датасете первый образец, в котором используется это слово. Как оно переводится? Как предварительно обученная модель переводит то же английское предложение?";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1mme498"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function Oa(k){let M,b="💡 Если вы используете многоязыковой токенизатор, такой как mBART, mBART-50 или M2M100, вам нужно задать языковые коды ваших входных и целевых данных в токенизаторе, задав правильные значения параметрам <code>tokenizer.src_lang</code> и <code>tokenizer.tgt_lang</code>.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-57iu9u"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function Ka(k){let M,b="💡 Если вы используете модель T5 (точнее, одну из контрольных точек <code>t5-xxx</code>), модель будет ожидать, что текстовые данные будут иметь префикс, указывающий на поставленную задачу, например <code>translate: English to French:</code>.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-hbfk5e"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function lM(k){let M,b="⚠️ Мы не обращаем внимания на маску внимания целевых значений, так как модель не будет этого ожидать. Вместо этого метки, соответствующие токенам дополнения, должны быть заданы как <code>-100</code>, чтобы они игнорировались при вычислении потерь. Это будет сделано нашим коллатором данных позже, так как мы применяем динамическое дополнение (dynamic padding), но если вы используете дополнение (padding) здесь, вы должны адаптировать функцию предварительной обработки данных, чтобы установить все метки, соответствующие токену дополнения, в <code>-100</code>.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-2e5ny2"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function eM(k){let M,b,J,f="Прежде всего, нам нужна актуальная модель, которую нужно дообучить. Мы воспользуемся обычным API <code>AutoModel</code>:",g,u,R,x,_;return M=new Rl({props:{title:"Дообучение модели с Keras",local:"fine-tuning-the-model-with-keras",headingTag:"h2"}}),u=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRGQXV0b01vZGVsRm9yU2VxMlNlcUxNJTBBJTBBbW9kZWwlMjAlM0QlMjBURkF1dG9Nb2RlbEZvclNlcTJTZXFMTS5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCUyQyUyMGZyb21fcHQlM0RUcnVlKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TFAutoModelForSeq2SeqLM

model = TFAutoModelForSeq2SeqLM.from_pretrained(model_checkpoint, from_pt=<span class="hljs-literal">True</span>)`,wrap:!1}}),x=new le({props:{warning:!1,$$slots:{default:[tM]},$$scope:{ctx:k}}}),{c(){m(M.$$.fragment),b=n(),J=c("p"),J.innerHTML=f,g=n(),m(u.$$.fragment),R=n(),m(x.$$.fragment)},l($){T(M.$$.fragment,$),b=a($),J=y($,"P",{"data-svelte-h":!0}),o(J)!=="svelte-7d8pec"&&(J.innerHTML=f),g=a($),T(u.$$.fragment,$),R=a($),T(x.$$.fragment,$)},m($,C){w(M,$,C),s($,b,C),s($,J,C),s($,g,C),w(u,$,C),s($,R,C),w(x,$,C),_=!0},i($){_||(i(M.$$.fragment,$),i(u.$$.fragment,$),i(x.$$.fragment,$),_=!0)},o($){U(M.$$.fragment,$),U(u.$$.fragment,$),U(x.$$.fragment,$),_=!1},d($){$&&(e(b),e(J),e(g),e(R)),j(M,$),j(u,$),j(x,$)}}}function sM(k){let M,b,J,f='Фактический код, использующий <code>Trainer</code>, будет таким же, как и раньше, с одним лишь небольшим изменением: мы используем <a href="https://huggingface.co/transformers/main_classes/trainer.html#seq2seqtrainer" rel="nofollow"><code>Seq2SeqTrainer</code></a>, который является подклассом <code>Trainer</code>, что позволит нам правильно работать с оценкой, используя метод <code>generate()</code> для предсказания выходов на основе входов. Мы рассмотрим это более подробно, когда будем говорить о вычислении метрик.',g,u,R="Прежде всего, нам нужна реальная модель, которую нужно дообучить. Мы воспользуемся обычным API <code>AutoModel</code>:",x,_,$;return M=new Rl({props:{title:"Дообучение модели с помощью API Trainer",local:"fine-tuning-the-model-with-the-trainer-api",headingTag:"h2"}}),_=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvclNlcTJTZXFMTSUwQSUwQW1vZGVsJTIwJTNEJTIwQXV0b01vZGVsRm9yU2VxMlNlcUxNLmZyb21fcHJldHJhaW5lZChtb2RlbF9jaGVja3BvaW50KQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForSeq2SeqLM

model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)`,wrap:!1}}),{c(){m(M.$$.fragment),b=n(),J=c("p"),J.innerHTML=f,g=n(),u=c("p"),u.innerHTML=R,x=n(),m(_.$$.fragment)},l(C){T(M.$$.fragment,C),b=a(C),J=y(C,"P",{"data-svelte-h":!0}),o(J)!=="svelte-1x8acsz"&&(J.innerHTML=f),g=a(C),u=y(C,"P",{"data-svelte-h":!0}),o(u)!=="svelte-1k3531i"&&(u.innerHTML=R),x=a(C),T(_.$$.fragment,C)},m(C,V){w(M,C,V),s(C,b,V),s(C,J,V),s(C,g,V),s(C,u,V),s(C,x,V),w(_,C,V),$=!0},i(C){$||(i(M.$$.fragment,C),i(_.$$.fragment,C),$=!0)},o(C){U(M.$$.fragment,C),U(_.$$.fragment,C),$=!1},d(C){C&&(e(b),e(J),e(g),e(u),e(x)),j(M,C),j(_,C)}}}function tM(k){let M,b=`💡 Контрольная точка <code>Helsinki-NLP/opus-mt-en-fr</code> имеет только веса PyTorch, поэтому
вы получите ошибку, если попытаетесь загрузить модель без использования аргумента
<code>from_pt=True</code> в методе <code>from_pretrained()</code>. Когда вы указываете
<code>from_pt=True</code>, библиотека автоматически загрузит и преобразует
веса из PyTorch для вас. Как видите, очень просто переключаться между
фреймворками в 🤗 Transformers!`;return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-3mdlmt"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function nM(k){let M,b;return M=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclNlcTJTZXElMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yU2VxMlNlcSh0b2tlbml6ZXIlMkMlMjBtb2RlbCUzRG1vZGVsJTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QlMjJ0ZiUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForSeq2Seq

data_collator = DataCollatorForSeq2Seq(tokenizer, model=model, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>)`,wrap:!1}}),{c(){m(M.$$.fragment)},l(J){T(M.$$.fragment,J)},m(J,f){w(M,J,f),b=!0},i(J){b||(i(M.$$.fragment,J),b=!0)},o(J){U(M.$$.fragment,J),b=!1},d(J){j(M,J)}}}function aM(k){let M,b;return M=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclNlcTJTZXElMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yU2VxMlNlcSh0b2tlbml6ZXIlMkMlMjBtb2RlbCUzRG1vZGVsKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForSeq2Seq

data_collator = DataCollatorForSeq2Seq(tokenizer, model=model)`,wrap:!1}}),{c(){m(M.$$.fragment)},l(J){T(M.$$.fragment,J)},m(J,f){w(M,J,f),b=!0},i(J){b||(i(M.$$.fragment,J),b=!0)},o(J){U(M.$$.fragment,J),b=!1},d(J){j(M,J)}}}function MM(k){let M,b="Теперь мы можем использовать этот <code>data_collator</code> для преобразования каждого из наших датасетов в <code>tf.data.Dataset</code>, готовый к обучению:",J,f,g;return f=new h({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMG1vZGVsLnByZXBhcmVfdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBiYXRjaF9zaXplJTNEMzIlMkMlMEEpJTBBdGZfZXZhbF9kYXRhc2V0JTIwJTNEJTIwbW9kZWwucHJlcGFyZV90Zl9kYXRhc2V0KCUwQSUyMCUyMCUyMCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHNodWZmbGUlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0QxNiUyQyUwQSk=",highlighted:`tf_train_dataset = model.prepare_tf_dataset(
    tokenized_datasets[<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_datasets[<span class="hljs-string">&quot;validation&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">16</span>,
)`,wrap:!1}}),{c(){M=c("p"),M.innerHTML=b,J=n(),m(f.$$.fragment)},l(u){M=y(u,"P",{"data-svelte-h":!0}),o(M)!=="svelte-bbama3"&&(M.innerHTML=b),J=a(u),T(f.$$.fragment,u)},m(u,R){s(u,M,R),s(u,J,R),w(f,u,R),g=!0},i(u){g||(i(f.$$.fragment,u),g=!0)},o(u){U(f.$$.fragment,u),g=!1},d(u){u&&(e(M),e(J)),j(f,u)}}}function pM(k){let M,b="Мы передадим этот <code>data_collator</code> в <code>Seq2SeqTrainer</code>. Далее давайте рассмотрим метрику.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1lj7qv2"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},i:zl,o:zl,d(J){J&&e(M)}}}function Ba(k){let M,b="Свойство, которое <code>Seq2SeqTrainer</code> добавляет к своему суперклассу <code>Trainer</code>, - это возможность использовать метод <code>generate()</code> во время оценки или предсказания. Во время обучения модель будет использовать <code>decoder_input_ids</code> с маской внимания, гарантирующей, что она не будет использовать токены после токена, который пытается предсказать, чтобы ускорить обучение. Во время инференса мы не сможем использовать эти данные, так как у нас не будет меток, поэтому было бы неплохо оценить нашу модель с аналогичной настройкой.",J,f,g='Как мы видели в <a href="../chapter1/6">Главе 1</a>, декодер выполняет инференс, предсказывая токены один за другим - то, что за кулисами реализовано в 🤗 Transformers методом <code>generate()</code>. Тренер <code>Seq2SeqTrainer</code> позволит нам использовать этот метод для оценки, если мы установим <code>predict_with_generate=True</code>.';return{c(){M=c("p"),M.innerHTML=b,J=n(),f=c("p"),f.innerHTML=g},l(u){M=y(u,"P",{"data-svelte-h":!0}),o(M)!=="svelte-vmg49v"&&(M.innerHTML=b),J=a(u),f=y(u,"P",{"data-svelte-h":!0}),o(f)!=="svelte-10guvvh"&&(f.innerHTML=g)},m(u,R){s(u,M,R),s(u,J,R),s(u,f,R)},d(u){u&&(e(M),e(J),e(f))}}}function JM(k){let M,b="Чтобы получить из результатов модели тексты, которые может использовать метрика, мы воспользуемся методом <code>tokenizer.batch_decode()</code>. Нам просто нужно очистить все значения <code>-100</code> в метках (токенизатор автоматически сделает то же самое для дополняющего токена):",J,f,g;return f=new h({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTBBZGVmJTIwY29tcHV0ZV9tZXRyaWNzKGV2YWxfcHJlZHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZHMlMkMlMjBsYWJlbHMlMjAlM0QlMjBldmFsX3ByZWRzJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTkyJTIwJUQxJTgxJUQwJUJCJUQxJTgzJUQxJTg3JUQwJUIwJUQwJUI1JTJDJTIwJUQwJUI1JUQxJTgxJUQwJUJCJUQwJUI4JTIwJUQwJUJDJUQwJUJFJUQwJUI0JUQwJUI1JUQwJUJCJUQxJThDJTIwJUQwJUIyJUQwJUJFJUQwJUI3JUQwJUIyJUQxJTgwJUQwJUIwJUQxJTg5JUQwJUIwJUQwJUI1JUQxJTgyJTIwJUQwJUIxJUQwJUJFJUQwJUJCJUQxJThDJUQxJTg4JUQwJUI1JTJDJTIwJUQxJTg3JUQwJUI1JUQwJUJDJTIwJUQwJUJGJUQxJTgwJUQwJUI1JUQwJUI0JUQxJTgxJUQwJUJBJUQwJUIwJUQwJUI3JUQwJUIwJUQwJUJEJUQwJUJEJUQxJThCJUQwJUI1JTIwJUQwJUJCJUQwJUJFJUQwJUIzJUQwJUI4JUQxJTgyJUQxJThCJTBBJTIwJTIwJTIwJTIwaWYlMjBpc2luc3RhbmNlKHByZWRzJTJDJTIwdHVwbGUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZHMlMjAlM0QlMjBwcmVkcyU1QjAlNUQlMEElMEElMjAlMjAlMjAlMjBkZWNvZGVkX3ByZWRzJTIwJTNEJTIwdG9rZW5pemVyLmJhdGNoX2RlY29kZShwcmVkcyUyQyUyMHNraXBfc3BlY2lhbF90b2tlbnMlM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCU5NyVEMCVCMCVEMCVCQyVEMCVCNSVEMCVCRCVEMSU4RiVEMCVCNSVEMCVCQyUyMC0xMDAlMjAlRDAlQjIlMjAlRDAlQkMlRDAlQjUlRDElODIlRDAlQkElRDAlQjAlRDElODUlMkMlMjAlRDElODIlRDAlQjAlRDAlQkElMjAlRDAlQkElRDAlQjAlRDAlQkElMjAlRDAlQkMlRDElOEIlMjAlRDAlQkQlRDAlQjUlMjAlRDAlQkMlRDAlQkUlRDAlQjYlRDAlQjUlRDAlQkMlMjAlRDAlQjglRDElODUlMjAlRDAlQjQlRDAlQjUlRDAlQkElRDAlQkUlRDAlQjQlRDAlQjglRDElODAlRDAlQkUlRDAlQjIlRDAlQjAlRDElODIlRDElOEMlMEElMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBucC53aGVyZShsYWJlbHMlMjAhJTNEJTIwLTEwMCUyQyUyMGxhYmVscyUyQyUyMHRva2VuaXplci5wYWRfdG9rZW5faWQpJTBBJTIwJTIwJTIwJTIwZGVjb2RlZF9sYWJlbHMlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKGxhYmVscyUyQyUyMHNraXBfc3BlY2lhbF90b2tlbnMlM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCU5RCVEMCVCNSVEMCVCQyVEMCVCRCVEMCVCRSVEMCVCMyVEMCVCRSUyMCVEMCVCRiVEMSU4MCVEMCVCRSVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCOSUyMCVEMCVCRiVEMCVCRSVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMCVCQSVEMCVCOCUwQSUyMCUyMCUyMCUyMGRlY29kZWRfcHJlZHMlMjAlM0QlMjAlNUJwcmVkLnN0cmlwKCklMjBmb3IlMjBwcmVkJTIwaW4lMjBkZWNvZGVkX3ByZWRzJTVEJTBBJTIwJTIwJTIwJTIwZGVjb2RlZF9sYWJlbHMlMjAlM0QlMjAlNUIlNUJsYWJlbC5zdHJpcCgpJTVEJTIwZm9yJTIwbGFiZWwlMjBpbiUyMGRlY29kZWRfbGFiZWxzJTVEJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwbWV0cmljLmNvbXB1dGUocHJlZGljdGlvbnMlM0RkZWNvZGVkX3ByZWRzJTJDJTIwcmVmZXJlbmNlcyUzRGRlY29kZWRfbGFiZWxzKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCU3QiUyMmJsZXUlMjIlM0ElMjByZXN1bHQlNUIlMjJzY29yZSUyMiU1RCU3RA==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np


<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_metrics</span>(<span class="hljs-params">eval_preds</span>):
    preds, labels = eval_preds
    <span class="hljs-comment"># В случае, если модель возвращает больше, чем предсказанные логиты</span>
    <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(preds, <span class="hljs-built_in">tuple</span>):
        preds = preds[<span class="hljs-number">0</span>]

    decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Заменяем -100 в метках, так как мы не можем их декодировать</span>
    labels = np.where(labels != -<span class="hljs-number">100</span>, labels, tokenizer.pad_token_id)
    decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Немного простой постобработки</span>
    decoded_preds = [pred.strip() <span class="hljs-keyword">for</span> pred <span class="hljs-keyword">in</span> decoded_preds]
    decoded_labels = [[label.strip()] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> decoded_labels]

    result = metric.compute(predictions=decoded_preds, references=decoded_labels)
    <span class="hljs-keyword">return</span> {<span class="hljs-string">&quot;bleu&quot;</span>: result[<span class="hljs-string">&quot;score&quot;</span>]}`,wrap:!1}}),{c(){M=c("p"),M.innerHTML=b,J=n(),m(f.$$.fragment)},l(u){M=y(u,"P",{"data-svelte-h":!0}),o(M)!=="svelte-ubj7v9"&&(M.innerHTML=b),J=a(u),T(f.$$.fragment,u)},m(u,R){s(u,M,R),s(u,J,R),w(f,u,R),g=!0},i(u){g||(i(f.$$.fragment,u),g=!0)},o(u){U(f.$$.fragment,u),g=!1},d(u){u&&(e(M),e(J)),j(f,u)}}}function rM(k){let M,b='Чтобы получить из результатов модели тексты, которые может использовать метрика, мы воспользуемся методом <code>tokenizer.batch_decode()</code>. Нам нужно только очистить все знаки <code>-100</code> в метках; токенизатор автоматически сделает то же самое для дополняющего токена. Определим функцию, которая берет нашу модель и датасет и вычисляет на нем метрики. Мы также используем трюк, который значительно повышает производительность, - компиляцию нашего кода генерации с помощью <a href="https://www.tensorflow.org/xla" rel="nofollow">XLA</a>, ускоренного компилятора линейной алгебры TensorFlow. XLA применяет различные оптимизации к графу вычислений модели, что приводит к значительному увеличению скорости и использования памяти. Как описано в блоге Hugging Face <a href="https://huggingface.co/blog/tf-xla-generate" rel="nofollow">blog</a>, XLA лучше всего работает, когда наши входные формы не слишком сильно варьируются. Чтобы справиться с этим, мы разделим наши входные данные на части, кратные 128, и создадим новый датасет с коллатором с дополнением, а затем применим декоратор <code>@tf.function(jit_compile=True)</code> к нашей функции генерации, который обозначит всю функцию для компиляции с помощью XLA.',J,f,g;return f=new h({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBaW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEFmcm9tJTIwdHFkbSUyMGltcG9ydCUyMHRxZG0lMEElMEFnZW5lcmF0aW9uX2RhdGFfY29sbGF0b3IlMjAlM0QlMjBEYXRhQ29sbGF0b3JGb3JTZXEyU2VxKCUwQSUyMCUyMCUyMCUyMHRva2VuaXplciUyQyUyMG1vZGVsJTNEbW9kZWwlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnRmJTIyJTJDJTIwcGFkX3RvX211bHRpcGxlX29mJTNEMTI4JTBBKSUwQSUwQXRmX2dlbmVyYXRlX2RhdGFzZXQlMjAlM0QlMjBtb2RlbC5wcmVwYXJlX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydmFsaWRhdGlvbiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RnZW5lcmF0aW9uX2RhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjBiYXRjaF9zaXplJTNEOCUyQyUwQSklMEElMEElMEElNDB0Zi5mdW5jdGlvbihqaXRfY29tcGlsZSUzRFRydWUpJTBBZGVmJTIwZ2VuZXJhdGVfd2l0aF94bGEoYmF0Y2gpJTNBJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwbW9kZWwuZ2VuZXJhdGUoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRfaWRzJTNEYmF0Y2glNUIlMjJpbnB1dF9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhdHRlbnRpb25fbWFzayUzRGJhdGNoJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtYXhfbmV3X3Rva2VucyUzRDEyOCUyQyUwQSUyMCUyMCUyMCUyMCklMEElMEElMEFkZWYlMjBjb21wdXRlX21ldHJpY3MoKSUzQSUwQSUyMCUyMCUyMCUyMGFsbF9wcmVkcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMGFsbF9sYWJlbHMlMjAlM0QlMjAlNUIlNUQlMEElMEElMjAlMjAlMjAlMjBmb3IlMjBiYXRjaCUyQyUyMGxhYmVscyUyMGluJTIwdHFkbSh0Zl9nZW5lcmF0ZV9kYXRhc2V0KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByZWRpY3Rpb25zJTIwJTNEJTIwZ2VuZXJhdGVfd2l0aF94bGEoYmF0Y2gpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVjb2RlZF9wcmVkcyUyMCUzRCUyMHRva2VuaXplci5iYXRjaF9kZWNvZGUocHJlZGljdGlvbnMlMkMlMjBza2lwX3NwZWNpYWxfdG9rZW5zJTNEVHJ1ZSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBsYWJlbHMubnVtcHkoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMG5wLndoZXJlKGxhYmVscyUyMCElM0QlMjAtMTAwJTJDJTIwbGFiZWxzJTJDJTIwdG9rZW5pemVyLnBhZF90b2tlbl9pZCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMHRva2VuaXplci5iYXRjaF9kZWNvZGUobGFiZWxzJTJDJTIwc2tpcF9zcGVjaWFsX3Rva2VucyUzRFRydWUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVjb2RlZF9wcmVkcyUyMCUzRCUyMCU1QnByZWQuc3RyaXAoKSUyMGZvciUyMHByZWQlMjBpbiUyMGRlY29kZWRfcHJlZHMlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsLnN0cmlwKCklNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwZGVjb2RlZF9sYWJlbHMlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfcHJlZHMuZXh0ZW5kKGRlY29kZWRfcHJlZHMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWxsX2xhYmVscy5leHRlbmQoZGVjb2RlZF9sYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwbWV0cmljLmNvbXB1dGUocHJlZGljdGlvbnMlM0RhbGxfcHJlZHMlMkMlMjByZWZlcmVuY2VzJTNEYWxsX2xhYmVscyklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMjJibGV1JTIyJTNBJTIwcmVzdWx0JTVCJTIyc2NvcmUlMjIlNUQlN0Q=",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf
<span class="hljs-keyword">from</span> tqdm <span class="hljs-keyword">import</span> tqdm

generation_data_collator = DataCollatorForSeq2Seq(
    tokenizer, model=model, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>, pad_to_multiple_of=<span class="hljs-number">128</span>
)

tf_generate_dataset = model.prepare_tf_dataset(
    tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>],
    collate_fn=generation_data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">8</span>,
)


<span class="hljs-meta">@tf.function(<span class="hljs-params">jit_compile=<span class="hljs-literal">True</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">generate_with_xla</span>(<span class="hljs-params">batch</span>):
    <span class="hljs-keyword">return</span> model.generate(
        input_ids=batch[<span class="hljs-string">&quot;input_ids&quot;</span>],
        attention_mask=batch[<span class="hljs-string">&quot;attention_mask&quot;</span>],
        max_new_tokens=<span class="hljs-number">128</span>,
    )


<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_metrics</span>():
    all_preds = []
    all_labels = []

    <span class="hljs-keyword">for</span> batch, labels <span class="hljs-keyword">in</span> tqdm(tf_generate_dataset):
        predictions = generate_with_xla(batch)
        decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=<span class="hljs-literal">True</span>)
        labels = labels.numpy()
        labels = np.where(labels != -<span class="hljs-number">100</span>, labels, tokenizer.pad_token_id)
        decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=<span class="hljs-literal">True</span>)
        decoded_preds = [pred.strip() <span class="hljs-keyword">for</span> pred <span class="hljs-keyword">in</span> decoded_preds]
        decoded_labels = [[label.strip()] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> decoded_labels]
        all_preds.extend(decoded_preds)
        all_labels.extend(decoded_labels)

    result = metric.compute(predictions=all_preds, references=all_labels)
    <span class="hljs-keyword">return</span> {<span class="hljs-string">&quot;bleu&quot;</span>: result[<span class="hljs-string">&quot;score&quot;</span>]}`,wrap:!1}}),{c(){M=c("p"),M.innerHTML=b,J=n(),m(f.$$.fragment)},l(u){M=y(u,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1wvossk"&&(M.innerHTML=b),J=a(u),T(f.$$.fragment,u)},m(u,R){s(u,M,R),s(u,J,R),w(f,u,R),g=!0},i(u){g||(i(f.$$.fragment,u),g=!0)},o(u){U(f.$$.fragment,u),g=!1},d(u){u&&(e(M),e(J)),j(f,u)}}}function iM(k){let M,b="Когда это сделано, мы можем определить наши <code>Seq2SeqTrainingArguments</code>. Как и в случае с <code>Trainer</code>, мы используем подкласс <code>TrainingArguments</code>, который содержит еще несколько дополнительных полей:",J,f,g,u,R="Помимо обычных гиперпараметров (таких как скорость обучения, количество эпох, размер батча и некоторое затухание веса), здесь есть несколько отличий по сравнению с тем, что мы видели в предыдущих разделах:",x,_,$="<li>Мы не задаем никаких регулярных оценок, так как оценка занимает много времени; мы просто оценим нашу модель один раз до обучения и после.</li> <li>Мы установили <code>fp16=True</code>, что ускоряет обучение на современных GPU.</li> <li>Мы устанавливаем <code>predict_with_generate=True</code>, как обсуждалось выше.</li> <li>Мы используем <code>push_to_hub=True</code> для загрузки модели в Hub в конце каждой эпохи.</li>",C,V,K='Обратите внимание, что в аргументе <code>hub_model_id</code> можно указать полное имя розитория, в который вы хотите отправить модель (в частности, этот аргумент нужно использовать, чтобы отправить модель в организацию). Например, когда мы отправили модель в организацию <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, мы добавили <code>hub_model_id=&quot;huggingface-course/marian-finetuned-kde4-en-to-fr&quot;</code> в <code>Seq2SeqTrainingArguments</code>. По умолчанию используемый розиторий будет находиться в вашем пространстве имен и называться в соответствии с заданным вами выходным каталогом, поэтому в нашем случае это будет <code>&quot;sgugger/marian-finetuned-kde4-en-to-fr&quot;</code> (это модель, на которую мы ссылались в начале этого раздела).',ml,X,H,L,B="Наконец, мы просто передаем все в <code>Seq2SeqTrainer</code>:",Tl,W,Y,P,N="Перед обучением мы сначала посмотрим, какую оценку получила наша модель, чтобы проверить, не ухудшаем ли мы результаты, дообучив ее. Выполнение этой команды займет некоторое время, поэтому во время ее выполнения можно выпить кофе:",$l,O,E,ll,v,A,pl="Оценка BLEU в 39 баллов не так уж плохо, что говорит о том, что наша модель уже хорошо справляется с переводом английских предложений на французский.",el,G,d="Далее следует обучение, которое также займет некоторое время:",Z,sl,wl,Ul,Jl="Обратите внимание, что во время обучения каждый раз, когда модель сохраняется (здесь - каждую эпоху), она загружается на Hub в фоновом режиме. Таким образом, при необходимости вы сможете возобновить обучение на другой машине.",dl,z,Fl="После завершения обучения мы снова оцениваем нашу модель - надеемся, мы увидим некоторое улучшение в показателе BLEU!",fl,F,bl,S,Yl,cl,rl="Это улучшение почти на 14 пунктов, что очень хорошо.",hl,q,Sl="Наконец, мы используем метод <code>push_to_hub()</code>, чтобы убедиться, что загружена последняя версия модели. Тренер также создает карту модели со всеми результатами оценки и загружает ее. Эта карта модели содержит метаданные, которые помогают хабу моделей выбрать виджет для демонстрации инференса. Обычно ничего не нужно указывать, так как он сам определяет нужный виджет по классу модели, но в данном случае один и тот же класс модели может быть использован для всех видов задач, связанных с последовательностями, поэтому мы указываем, что это модель перевода:",Cl,D,xl,tl,gl="Эта команда возвращает URL-адрес только что выполненного коммита, если вы хотите его просмотреть:",_l,nl,jl,yl,il="На этом этапе вы можете использовать виджет инференса на Model Hub, чтобы протестировать свою модель и поделиться ею с друзьями. Вы успешно дообучили модель для задачи перевода - поздравляем!",Zl,al,kl="Если вы хотите более глубоко погрузиться в цикл обучения, мы покажем вам, как сделать то же самое с помощью 🤗 Accelerate.",Il;return f=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFNlcTJTZXFUcmFpbmluZ0FyZ3VtZW50cyUwQSUwQWFyZ3MlMjAlM0QlMjBTZXEyU2VxVHJhaW5pbmdBcmd1bWVudHMoJTBBJTIwJTIwJTIwJTIwZiUyMm1hcmlhbi1maW5ldHVuZWQta2RlNC1lbi10by1mciUyMiUyQyUwQSUyMCUyMCUyMCUyMGV2YWx1YXRpb25fc3RyYXRlZ3klM0QlMjJubyUyMiUyQyUwQSUyMCUyMCUyMCUyMHNhdmVfc3RyYXRlZ3klM0QlMjJlcG9jaCUyMiUyQyUwQSUyMCUyMCUyMCUyMGxlYXJuaW5nX3JhdGUlM0QyZS01JTJDJTBBJTIwJTIwJTIwJTIwcGVyX2RldmljZV90cmFpbl9iYXRjaF9zaXplJTNEMzIlMkMlMEElMjAlMjAlMjAlMjBwZXJfZGV2aWNlX2V2YWxfYmF0Y2hfc2l6ZSUzRDY0JTJDJTBBJTIwJTIwJTIwJTIwd2VpZ2h0X2RlY2F5JTNEMC4wMSUyQyUwQSUyMCUyMCUyMCUyMHNhdmVfdG90YWxfbGltaXQlM0QzJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3RyYWluX2Vwb2NocyUzRDMlMkMlMEElMjAlMjAlMjAlMjBwcmVkaWN0X3dpdGhfZ2VuZXJhdGUlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwZnAxNiUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBwdXNoX3RvX2h1YiUzRFRydWUlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Seq2SeqTrainingArguments

args = Seq2SeqTrainingArguments(
    <span class="hljs-string">f&quot;marian-finetuned-kde4-en-to-fr&quot;</span>,
    evaluation_strategy=<span class="hljs-string">&quot;no&quot;</span>,
    save_strategy=<span class="hljs-string">&quot;epoch&quot;</span>,
    learning_rate=<span class="hljs-number">2e-5</span>,
    per_device_train_batch_size=<span class="hljs-number">32</span>,
    per_device_eval_batch_size=<span class="hljs-number">64</span>,
    weight_decay=<span class="hljs-number">0.01</span>,
    save_total_limit=<span class="hljs-number">3</span>,
    num_train_epochs=<span class="hljs-number">3</span>,
    predict_with_generate=<span class="hljs-literal">True</span>,
    fp16=<span class="hljs-literal">True</span>,
    push_to_hub=<span class="hljs-literal">True</span>,
)`,wrap:!1}}),X=new le({props:{$$slots:{default:[cM]},$$scope:{ctx:k}}}),W=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFNlcTJTZXFUcmFpbmVyJTBBJTBBdHJhaW5lciUyMCUzRCUyMFNlcTJTZXFUcmFpbmVyKCUwQSUyMCUyMCUyMCUyMG1vZGVsJTJDJTBBJTIwJTIwJTIwJTIwYXJncyUyQyUwQSUyMCUyMCUyMCUyMHRyYWluX2RhdGFzZXQlM0R0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGV2YWxfZGF0YXNldCUzRHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBkYXRhX2NvbGxhdG9yJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHRva2VuaXplciUzRHRva2VuaXplciUyQyUwQSUyMCUyMCUyMCUyMGNvbXB1dGVfbWV0cmljcyUzRGNvbXB1dGVfbWV0cmljcyUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Seq2SeqTrainer

trainer = Seq2SeqTrainer(
    model,
    args,
    train_dataset=tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>],
    eval_dataset=tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
)`,wrap:!1}}),O=new h({props:{code:"dHJhaW5lci5ldmFsdWF0ZShtYXhfbGVuZ3RoJTNEbWF4X2xlbmd0aCk=",highlighted:"trainer.evaluate(max_length=max_length)",wrap:!1}}),ll=new h({props:{code:"JTdCJ2V2YWxfbG9zcyclM0ElMjAxLjY5NjQ0MDgxNTkyNTU5ODElMkMlMEElMjAnZXZhbF9ibGV1JyUzQSUyMDM5LjI2ODY1MDYxMDA3NjE2JTJDJTBBJTIwJ2V2YWxfcnVudGltZSclM0ElMjA5NjUuODg4NCUyQyUwQSUyMCdldmFsX3NhbXBsZXNfcGVyX3NlY29uZCclM0ElMjAyMS43NiUyQyUwQSUyMCdldmFsX3N0ZXBzX3Blcl9zZWNvbmQnJTNBJTIwMC4zNDElN0Q=",highlighted:`{<span class="hljs-string">&#x27;eval_loss&#x27;</span>: <span class="hljs-number">1.6964408159255981</span>,
 <span class="hljs-string">&#x27;eval_bleu&#x27;</span>: <span class="hljs-number">39.26865061007616</span>,
 <span class="hljs-string">&#x27;eval_runtime&#x27;</span>: <span class="hljs-number">965.8884</span>,
 <span class="hljs-string">&#x27;eval_samples_per_second&#x27;</span>: <span class="hljs-number">21.76</span>,
 <span class="hljs-string">&#x27;eval_steps_per_second&#x27;</span>: <span class="hljs-number">0.341</span>}`,wrap:!1}}),sl=new h({props:{code:"dHJhaW5lci50cmFpbigp",highlighted:"trainer.train()",wrap:!1}}),F=new h({props:{code:"dHJhaW5lci5ldmFsdWF0ZShtYXhfbGVuZ3RoJTNEbWF4X2xlbmd0aCk=",highlighted:"trainer.evaluate(max_length=max_length)",wrap:!1}}),S=new h({props:{code:"JTdCJ2V2YWxfbG9zcyclM0ElMjAwLjg1NTg1MDU3NzM1NDQzMTIlMkMlMEElMjAnZXZhbF9ibGV1JyUzQSUyMDUyLjk0MTYxMzM3Nzc1NTc2JTJDJTBBJTIwJ2V2YWxfcnVudGltZSclM0ElMjA3MTQuMjU3NiUyQyUwQSUyMCdldmFsX3NhbXBsZXNfcGVyX3NlY29uZCclM0ElMjAyOS40MjYlMkMlMEElMjAnZXZhbF9zdGVwc19wZXJfc2Vjb25kJyUzQSUyMDAuNDYxJTJDJTBBJTIwJ2Vwb2NoJyUzQSUyMDMuMCU3RA==",highlighted:`{<span class="hljs-string">&#x27;eval_loss&#x27;</span>: <span class="hljs-number">0.8558505773544312</span>,
 <span class="hljs-string">&#x27;eval_bleu&#x27;</span>: <span class="hljs-number">52.94161337775576</span>,
 <span class="hljs-string">&#x27;eval_runtime&#x27;</span>: <span class="hljs-number">714.2576</span>,
 <span class="hljs-string">&#x27;eval_samples_per_second&#x27;</span>: <span class="hljs-number">29.426</span>,
 <span class="hljs-string">&#x27;eval_steps_per_second&#x27;</span>: <span class="hljs-number">0.461</span>,
 <span class="hljs-string">&#x27;epoch&#x27;</span>: <span class="hljs-number">3.0</span>}`,wrap:!1}}),D=new h({props:{code:"dHJhaW5lci5wdXNoX3RvX2h1Yih0YWdzJTNEJTIydHJhbnNsYXRpb24lMjIlMkMlMjBjb21taXRfbWVzc2FnZSUzRCUyMlRyYWluaW5nJTIwY29tcGxldGUlMjIp",highlighted:'trainer.push_to_hub(tags=<span class="hljs-string">&quot;translation&quot;</span>, commit_message=<span class="hljs-string">&quot;Training complete&quot;</span>)',wrap:!1}}),nl=new h({props:{code:"J2h0dHBzJTNBJTJGJTJGaHVnZ2luZ2ZhY2UuY28lMkZzZ3VnZ2VyJTJGbWFyaWFuLWZpbmV0dW5lZC1rZGU0LWVuLXRvLWZyJTJGY29tbWl0JTJGMzYwMWQ2MjFlM2JhYWUyYmM2M2QzMzExNDUyNTM1ZjhmNThmNmVmMyc=",highlighted:'<span class="hljs-string">&#x27;https://huggingface.co/sgugger/marian-finetuned-kde4-en-to-fr/commit/3601d621e3baae2bc63d3311452535f8f58f6ef3&#x27;</span>',wrap:!1}}),{c(){M=c("p"),M.innerHTML=b,J=n(),m(f.$$.fragment),g=n(),u=c("p"),u.textContent=R,x=n(),_=c("ul"),_.innerHTML=$,C=n(),V=c("p"),V.innerHTML=K,ml=n(),m(X.$$.fragment),H=n(),L=c("p"),L.innerHTML=B,Tl=n(),m(W.$$.fragment),Y=n(),P=c("p"),P.textContent=N,$l=n(),m(O.$$.fragment),E=n(),m(ll.$$.fragment),v=n(),A=c("p"),A.textContent=pl,el=n(),G=c("p"),G.textContent=d,Z=n(),m(sl.$$.fragment),wl=n(),Ul=c("p"),Ul.textContent=Jl,dl=n(),z=c("p"),z.textContent=Fl,fl=n(),m(F.$$.fragment),bl=n(),m(S.$$.fragment),Yl=n(),cl=c("p"),cl.textContent=rl,hl=n(),q=c("p"),q.innerHTML=Sl,Cl=n(),m(D.$$.fragment),xl=n(),tl=c("p"),tl.textContent=gl,_l=n(),m(nl.$$.fragment),jl=n(),yl=c("p"),yl.textContent=il,Zl=n(),al=c("p"),al.textContent=kl},l(r){M=y(r,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1206bj"&&(M.innerHTML=b),J=a(r),T(f.$$.fragment,r),g=a(r),u=y(r,"P",{"data-svelte-h":!0}),o(u)!=="svelte-1g6lxt8"&&(u.textContent=R),x=a(r),_=y(r,"UL",{"data-svelte-h":!0}),o(_)!=="svelte-jnbdap"&&(_.innerHTML=$),C=a(r),V=y(r,"P",{"data-svelte-h":!0}),o(V)!=="svelte-11sjn10"&&(V.innerHTML=K),ml=a(r),T(X.$$.fragment,r),H=a(r),L=y(r,"P",{"data-svelte-h":!0}),o(L)!=="svelte-15vnnda"&&(L.innerHTML=B),Tl=a(r),T(W.$$.fragment,r),Y=a(r),P=y(r,"P",{"data-svelte-h":!0}),o(P)!=="svelte-1jymi40"&&(P.textContent=N),$l=a(r),T(O.$$.fragment,r),E=a(r),T(ll.$$.fragment,r),v=a(r),A=y(r,"P",{"data-svelte-h":!0}),o(A)!=="svelte-1y0l7kd"&&(A.textContent=pl),el=a(r),G=y(r,"P",{"data-svelte-h":!0}),o(G)!=="svelte-1kmpfak"&&(G.textContent=d),Z=a(r),T(sl.$$.fragment,r),wl=a(r),Ul=y(r,"P",{"data-svelte-h":!0}),o(Ul)!=="svelte-1tlaj4y"&&(Ul.textContent=Jl),dl=a(r),z=y(r,"P",{"data-svelte-h":!0}),o(z)!=="svelte-noullp"&&(z.textContent=Fl),fl=a(r),T(F.$$.fragment,r),bl=a(r),T(S.$$.fragment,r),Yl=a(r),cl=y(r,"P",{"data-svelte-h":!0}),o(cl)!=="svelte-1q0mll6"&&(cl.textContent=rl),hl=a(r),q=y(r,"P",{"data-svelte-h":!0}),o(q)!=="svelte-3ixr6r"&&(q.innerHTML=Sl),Cl=a(r),T(D.$$.fragment,r),xl=a(r),tl=y(r,"P",{"data-svelte-h":!0}),o(tl)!=="svelte-1ho8e0y"&&(tl.textContent=gl),_l=a(r),T(nl.$$.fragment,r),jl=a(r),yl=y(r,"P",{"data-svelte-h":!0}),o(yl)!=="svelte-1wxxrqy"&&(yl.textContent=il),Zl=a(r),al=y(r,"P",{"data-svelte-h":!0}),o(al)!=="svelte-qglb53"&&(al.textContent=kl)},m(r,Q){s(r,M,Q),s(r,J,Q),w(f,r,Q),s(r,g,Q),s(r,u,Q),s(r,x,Q),s(r,_,Q),s(r,C,Q),s(r,V,Q),s(r,ml,Q),w(X,r,Q),s(r,H,Q),s(r,L,Q),s(r,Tl,Q),w(W,r,Q),s(r,Y,Q),s(r,P,Q),s(r,$l,Q),w(O,r,Q),s(r,E,Q),w(ll,r,Q),s(r,v,Q),s(r,A,Q),s(r,el,Q),s(r,G,Q),s(r,Z,Q),w(sl,r,Q),s(r,wl,Q),s(r,Ul,Q),s(r,dl,Q),s(r,z,Q),s(r,fl,Q),w(F,r,Q),s(r,bl,Q),w(S,r,Q),s(r,Yl,Q),s(r,cl,Q),s(r,hl,Q),s(r,q,Q),s(r,Cl,Q),w(D,r,Q),s(r,xl,Q),s(r,tl,Q),s(r,_l,Q),w(nl,r,Q),s(r,jl,Q),s(r,yl,Q),s(r,Zl,Q),s(r,al,Q),Il=!0},i(r){Il||(i(f.$$.fragment,r),i(X.$$.fragment,r),i(W.$$.fragment,r),i(O.$$.fragment,r),i(ll.$$.fragment,r),i(sl.$$.fragment,r),i(F.$$.fragment,r),i(S.$$.fragment,r),i(D.$$.fragment,r),i(nl.$$.fragment,r),Il=!0)},o(r){U(f.$$.fragment,r),U(X.$$.fragment,r),U(W.$$.fragment,r),U(O.$$.fragment,r),U(ll.$$.fragment,r),U(sl.$$.fragment,r),U(F.$$.fragment,r),U(S.$$.fragment,r),U(D.$$.fragment,r),U(nl.$$.fragment,r),Il=!1},d(r){r&&(e(M),e(J),e(g),e(u),e(x),e(_),e(C),e(V),e(ml),e(H),e(L),e(Tl),e(Y),e(P),e($l),e(E),e(v),e(A),e(el),e(G),e(Z),e(wl),e(Ul),e(dl),e(z),e(fl),e(bl),e(Yl),e(cl),e(hl),e(q),e(Cl),e(xl),e(tl),e(_l),e(jl),e(yl),e(Zl),e(al)),j(f,r),j(X,r),j(W,r),j(O,r),j(ll,r),j(sl,r),j(F,r),j(S,r),j(D,r),j(nl,r)}}}function UM(k){let M,b="Прежде чем начать, давайте посмотрим, какие результаты мы получим от нашей модели без какого-либо обучения:",J,f,g,u,R,x,_="Как только это будет сделано, мы сможем подготовить все необходимое для компиляции и обучения нашей модели. Обратите внимание на использование <code>tf.keras.mixed_precision.set_global_policy(&quot;mixed_float16&quot;)</code> - это укажет Keras обучать с использованием float16, что может дать значительное ускорение на GPU, поддерживающих эту функцию (Nvidia 20xx/V100 или новее).",$,C,V,K,ml='Далее мы определяем обратный вызов <code>PushToHubCallback</code> для загрузки нашей модели в Hub во время обучения, как мы видели в <a href="../chapter7/2">разделе 2</a>, а затем мы просто подгоняем модель с помощью этого обратного вызова:',X,H,L,B,Tl='Обратите внимание, что с помощью аргумента <code>hub_model_id</code> можно указать имя репозитория, в который вы хотите отправить модель (в частности, этот аргумент нужно использовать, чтобы отправить модель в организацию). Например, когда мы отправили модель в организацию <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, мы добавили <code>hub_model_id=&quot;huggingface-course/marian-finetuned-kde4-en-to-fr&quot;</code> в <code>Seq2SeqTrainingArguments</code>. По умолчанию используемый репозиторий будет находиться в вашем пространстве имен и называться в соответствии с заданным вами выходным каталогом, поэтому здесь это будет <code>&quot;sgugger/marian-finetuned-kde4-en-to-fr&quot;</code> (это модель, на которую мы ссылались в начале этого раздела).',W,Y,P,N,$l="Наконец, давайте посмотрим, как выглядят наши метрики после завершения обучения:",O,E,ll,v,A,pl,el="На этом этапе вы можете использовать виджет инференса на Model Hub, чтобы протестировать свою модель и поделиться ею с друзьями. Вы успешно дообучили модель для задачи перевода - поздравляем!",G;return f=new h({props:{code:"cHJpbnQoY29tcHV0ZV9tZXRyaWNzKCkp",highlighted:'<span class="hljs-built_in">print</span>(compute_metrics())',wrap:!1}}),u=new h({props:{code:"JTdCJ2JsZXUnJTNBJTIwMzMuMjY5ODM3MDE0NTQ3MzMlN0Q=",highlighted:'{&#x27;bleu&#x27;: <span class="hljs-number">33.26983701454733</span>}',wrap:!1}}),C=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFmcm9tJTIwdHJhbnNmb3JtZXJzLmtlcmFzX2NhbGxiYWNrcyUyMGltcG9ydCUyMFB1c2hUb0h1YkNhbGxiYWNrJTBBaW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEElMjMlMjAlRDAlOUElRDAlQkUlRDAlQkIlRDAlQjglRDElODclRDAlQjUlRDElODElRDElODIlRDAlQjIlRDAlQkUlMjAlRDElODglRDAlQjAlRDAlQjMlRDAlQkUlRDAlQjIlMjAlRDAlQkUlRDAlQjElRDElODMlRDElODclRDAlQjUlRDAlQkQlRDAlQjglRDElOEYlMjAtJTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQwJUJBJUQwJUJFJUQwJUJCJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQxJTgyJUQwJUIyJUQwJUJFJTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQwJUJDJUQwJUI1JUQxJTgwJUQwJUJFJUQwJUIyJTIwJUQwJUIyJTIwJUQwJUI0JUQwJUIwJUQxJTgyJUQwJUIwJUQxJTgxJUQwJUI1JUQxJTgyJUQwJUI1JTJDJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUI0JUQwJUI1JUQwJUJCJUQwJUI1JUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI1JTIwJUQwJUJEJUQwJUIwJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUJDJUQwJUI1JUQxJTgwJTIwJUQwJUIxJUQwJUIwJUQxJTgyJUQxJTg3JUQwJUIwJTJDJTIwJUQwJUI3JUQwJUIwJUQxJTgyJUQwJUI1JUQwJUJDJTIwJUQxJTgzJUQwJUJDJUQwJUJEJUQwJUJFJUQwJUI2JUQwJUI1JUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI1JTBBJTIzJTIwJUQwJUJEJUQwJUIwJTIwJUQwJUJFJUQwJUIxJUQxJTg5JUQwJUI1JUQwJUI1JTIwJUQwJUJBJUQwJUJFJUQwJUJCJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQxJTgyJUQwJUIyJUQwJUJFJTIwJUQxJThEJUQwJUJGJUQwJUJFJUQxJTg1LiUyMCVEMCU5RSVEMCVCMSVEMSU4MCVEMCVCMCVEMSU4MiVEMCVCOCVEMSU4MiVEMCVCNSUyMCVEMCVCMiVEMCVCRCVEMCVCOCVEMCVCQyVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNSUyQyUyMCVEMSU4NyVEMSU4MiVEMCVCRSUyMHRmX3RyYWluX2RhdGFzZXQlMjAlRDAlQjclRDAlQjQlRDAlQjUlRDElODElRDElOEMlMjAtJTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQwJUIxJUQwJUIwJUQxJTgyJUQxJTg3JTIwdGYuZGF0YS5EYXRhc2V0JTJDJTBBJTIzJTIwJUQwJUIwJTIwJUQwJUJEJUQwJUI1JTIwJUQwJUJFJUQxJTgwJUQwJUI4JUQwJUIzJUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJCJUQxJThDJUQwJUJEJUQxJThCJUQwJUI5JTIwJUQwJUI0JUQwJUIwJUQxJTgyJUQwJUIwJUQxJTgxJUQwJUI1JUQxJTgyJTIwSHVnZ2luZyUyMEZhY2UlMkMlMjAlRDAlQkYlRDAlQkUlRDElOEQlRDElODIlRDAlQkUlRDAlQkMlRDElODMlMjAlRDAlQjUlRDAlQjMlRDAlQkUlMjBsZW4oKSUyMCVEMSU4MyVEMCVCNiVEMCVCNSUyMCVEMSU4MCVEMCVCMCVEMCVCMiVEMCVCNSVEMCVCRCUyMG51bV9zYW1wbGVzJTIwJTJGJTJGJTIwYmF0Y2hfc2l6ZS4lMEFudW1fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV90cmFpbl9zdGVwcyUyMCUzRCUyMGxlbih0Zl90cmFpbl9kYXRhc2V0KSUyMColMjBudW1fZXBvY2hzJTBBJTBBb3B0aW1pemVyJTJDJTIwc2NoZWR1bGUlMjAlM0QlMjBjcmVhdGVfb3B0aW1pemVyKCUwQSUyMCUyMCUyMCUyMGluaXRfbHIlM0Q1ZS01JTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5fc3RlcHMlM0RudW1fdHJhaW5fc3RlcHMlMkMlMEElMjAlMjAlMjAlMjB3ZWlnaHRfZGVjYXlfcmF0ZSUzRDAuMDElMkMlMEEpJTBBbW9kZWwuY29tcGlsZShvcHRpbWl6ZXIlM0RvcHRpbWl6ZXIpJTBBJTBBJTIzJTIwJUQwJTlFJUQwJUIxJUQxJTgzJUQxJTg3JUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQxJTgxJUQwJUJFJTIwJUQxJTgxJUQwJUJDJUQwJUI1JUQxJTg4JUQwJUIwJUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI5JTIwJUQxJTgyJUQwJUJFJUQxJTg3JUQwJUJEJUQwJUJFJUQxJTgxJUQxJTgyJUQxJThDJUQxJThFJTIwZmxvYXQxNiUwQXRmLmtlcmFzLm1peGVkX3ByZWNpc2lvbi5zZXRfZ2xvYmFsX3BvbGljeSglMjJtaXhlZF9mbG9hdDE2JTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> create_optimizer
<span class="hljs-keyword">from</span> transformers.keras_callbacks <span class="hljs-keyword">import</span> PushToHubCallback
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

<span class="hljs-comment"># Количество шагов обучения - это количество примеров в датасете, разделенное на размер батча, затем умноженное</span>
<span class="hljs-comment"># на общее количество эпох. Обратите внимание, что tf_train_dataset здесь - это батч tf.data.Dataset,</span>
<span class="hljs-comment"># а не оригинальный датасет Hugging Face, поэтому его len() уже равен num_samples // batch_size.</span>
num_epochs = <span class="hljs-number">3</span>
num_train_steps = <span class="hljs-built_in">len</span>(tf_train_dataset) * num_epochs

optimizer, schedule = create_optimizer(
    init_lr=<span class="hljs-number">5e-5</span>,
    num_warmup_steps=<span class="hljs-number">0</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}}),H=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycy5rZXJhc19jYWxsYmFja3MlMjBpbXBvcnQlMjBQdXNoVG9IdWJDYWxsYmFjayUwQSUwQWNhbGxiYWNrJTIwJTNEJTIwUHVzaFRvSHViQ2FsbGJhY2soJTBBJTIwJTIwJTIwJTIwb3V0cHV0X2RpciUzRCUyMm1hcmlhbi1maW5ldHVuZWQta2RlNC1lbi10by1mciUyMiUyQyUyMHRva2VuaXplciUzRHRva2VuaXplciUwQSklMEElMEFtb2RlbC5maXQoJTBBJTIwJTIwJTIwJTIwdGZfdHJhaW5fZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMHZhbGlkYXRpb25fZGF0YSUzRHRmX2V2YWxfZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMGNhbGxiYWNrcyUzRCU1QmNhbGxiYWNrJTVEJTJDJTBBJTIwJTIwJTIwJTIwZXBvY2hzJTNEbnVtX2Vwb2NocyUyQyUwQSk=",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;marian-finetuned-kde4-en-to-fr&quot;</span>, tokenizer=tokenizer
)

model.fit(
    tf_train_dataset,
    validation_data=tf_eval_dataset,
    callbacks=[callback],
    epochs=num_epochs,
)`,wrap:!1}}),Y=new le({props:{$$slots:{default:[yM]},$$scope:{ctx:k}}}),E=new h({props:{code:"cHJpbnQoY29tcHV0ZV9tZXRyaWNzKCkp",highlighted:'<span class="hljs-built_in">print</span>(compute_metrics())',wrap:!1}}),v=new h({props:{code:"JTdCJ2JsZXUnJTNBJTIwNTcuMzM0MDY2MjcxNTQ1ODY1JTdE",highlighted:'{&#x27;bleu&#x27;: <span class="hljs-number">57.334066271545865</span>}',wrap:!1}}),{c(){M=c("p"),M.textContent=b,J=n(),m(f.$$.fragment),g=n(),m(u.$$.fragment),R=n(),x=c("p"),x.innerHTML=_,$=n(),m(C.$$.fragment),V=n(),K=c("p"),K.innerHTML=ml,X=n(),m(H.$$.fragment),L=n(),B=c("p"),B.innerHTML=Tl,W=n(),m(Y.$$.fragment),P=n(),N=c("p"),N.textContent=$l,O=n(),m(E.$$.fragment),ll=n(),m(v.$$.fragment),A=n(),pl=c("p"),pl.textContent=el},l(d){M=y(d,"P",{"data-svelte-h":!0}),o(M)!=="svelte-gmew68"&&(M.textContent=b),J=a(d),T(f.$$.fragment,d),g=a(d),T(u.$$.fragment,d),R=a(d),x=y(d,"P",{"data-svelte-h":!0}),o(x)!=="svelte-1xn1nin"&&(x.innerHTML=_),$=a(d),T(C.$$.fragment,d),V=a(d),K=y(d,"P",{"data-svelte-h":!0}),o(K)!=="svelte-1y5yk2y"&&(K.innerHTML=ml),X=a(d),T(H.$$.fragment,d),L=a(d),B=y(d,"P",{"data-svelte-h":!0}),o(B)!=="svelte-a70z1g"&&(B.innerHTML=Tl),W=a(d),T(Y.$$.fragment,d),P=a(d),N=y(d,"P",{"data-svelte-h":!0}),o(N)!=="svelte-5sv4xn"&&(N.textContent=$l),O=a(d),T(E.$$.fragment,d),ll=a(d),T(v.$$.fragment,d),A=a(d),pl=y(d,"P",{"data-svelte-h":!0}),o(pl)!=="svelte-1wxxrqy"&&(pl.textContent=el)},m(d,Z){s(d,M,Z),s(d,J,Z),w(f,d,Z),s(d,g,Z),w(u,d,Z),s(d,R,Z),s(d,x,Z),s(d,$,Z),w(C,d,Z),s(d,V,Z),s(d,K,Z),s(d,X,Z),w(H,d,Z),s(d,L,Z),s(d,B,Z),s(d,W,Z),w(Y,d,Z),s(d,P,Z),s(d,N,Z),s(d,O,Z),w(E,d,Z),s(d,ll,Z),w(v,d,Z),s(d,A,Z),s(d,pl,Z),G=!0},i(d){G||(i(f.$$.fragment,d),i(u.$$.fragment,d),i(C.$$.fragment,d),i(H.$$.fragment,d),i(Y.$$.fragment,d),i(E.$$.fragment,d),i(v.$$.fragment,d),G=!0)},o(d){U(f.$$.fragment,d),U(u.$$.fragment,d),U(C.$$.fragment,d),U(H.$$.fragment,d),U(Y.$$.fragment,d),U(E.$$.fragment,d),U(v.$$.fragment,d),G=!1},d(d){d&&(e(M),e(J),e(g),e(R),e(x),e($),e(V),e(K),e(X),e(L),e(B),e(W),e(P),e(N),e(O),e(ll),e(A),e(pl)),j(f,d),j(u,d),j(C,d),j(H,d),j(Y,d),j(E,d),j(v,d)}}}function cM(k){let M,b="💡 Если выходной каталог, который вы используете, уже существует, он должен быть локальным клоном того розитория, в который вы хотите выполнить push. Если это не так, вы получите ошибку при определении вашего <code>Seq2SeqTrainer</code> и должны будете задать новое имя.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1g7ypyw"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function yM(k){let M,b="💡 Если выходной каталог, который вы используете, уже существует, он должен быть локальным клоном репозитория, в который вы хотите выполнить push. Если это не так, вы получите ошибку при вызове <code>model.fit()</code> и должны будете задать новое имя.";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1y7dx38"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function Na(k){let M,b,J,f='Теперь давайте рассмотрим полный цикл обучения, чтобы вы могли легко настроить нужные вам части. Он будет выглядеть примерно так же, как мы делали это в <a href="../chapter7/2">Главе 2</a> и <a href="../chapter3/4">Главе 3</a>.',g,u,R,x,_="Вы уже видели все это несколько раз, поэтому мы пройдемся по коду довольно быстро. Сначала мы создадим <code>DataLoader</code> из наших датасетов, после чего установим для датасетов формат <code>&quot;torch&quot;</code>, чтобы получить тензоры PyTorch:",$,C,V,K,ml="Затем мы повторно инстанцируем нашу модель, чтобы убедиться, что мы не продолжаем дообучение предыдущей модели, а начинаем с предварительно обученной модели:",X,H,L,B,Tl="Тогда нам понадобится оптимизатор:",W,Y,P,N,$l="Когда у нас есть все эти объекты, мы можем отправить их в метод <code>accelerator.prepare()</code>. Помните, что если вы хотите обучаться на TPU в блокноте Colab, вам нужно будет перенести весь этот код в функцию обучения, которая не должна выполнять ни одной ячейки, инстанцирующей <code>Accelerator</code>.",O,E,ll,v,A="Теперь, когда мы отправили наш <code>train_dataloader</code> в <code>accelerator.prepare()</code>, мы можем использовать его длину для вычисления количества шагов обучения. Помните, что это всегда нужно делать после подготовки загрузчика данных, так как этот метод изменит длину <code>DataLoader</code>. Мы используем классический линейный планировшик скорости обучения до 0:",pl,el,G,d,Z="Наконец, чтобы отправить нашу модель в Hub, нам нужно создать объект <code>Repository</code> в рабочей папке. Сначала войдите в Hub Hugging Face, если вы еще не авторизованы. Мы определим имя розитория по идентификатору модели, который мы хотим присвоить нашей модели (не стесняйтесь заменить <code>repo_name</code> на свой собственный выбор; оно просто должно содержать ваше имя пользователя, что и делает функция <code>get_full_repo_name()</code>):",sl,wl,Ul,Jl,dl,z,Fl="Затем мы можем клонировать этот розиторий в локальную папку. Если она уже существует, эта локальная папка должна быть клоном того розитория, с которым мы работаем:",fl,F,bl,S,Yl="Теперь мы можем загрузить все, что сохранили в <code>output_dir</code>, вызвав метод <code>repo.push_to_hub()</code>. Это поможет нам загружать промежуточные модели в конце каждой эпохи.",cl,rl,hl,q,Sl="Теперь мы готовы написать полный цикл обучения. Чтобы упростить его оценочную часть, мы определяем эту функцию <code>postprocess()</code>, которая принимает прогнозы и метки и преобразует их в списки строк, которые будет ожидать наш объект <code>metric</code>:",Cl,D,xl,tl,gl='Цикл обучения очень похож на циклы в <a href="../chapter7/2">разделе 2</a> и <a href="../chapter3/1">главе 3</a>, с некоторыми отличиями в части оценки - так что давайте сосредоточимся на этом!',_l,nl,jl="Первое, что следует отметить, это то, что мы используем метод <code>generate()</code> для вычисления прогнозов, но это метод нашей базовой модели, а не обернутой модели 🤗 Accelerate, созданной в методе <code>prepare()</code>. Поэтому мы сначала развернем модель, а затем вызовем этот метод.",yl,il,Zl='Второй момент заключается в том, что, как и в случае с <a href="../chapter7/2">классификацией токенов</a>, два процесса могут дополнить входы и метки до разных форм, поэтому мы используем <code>accelerator.pad_across_processes()</code>, чтобы сделать прогнозы и метки одинаковыми по форме перед вызовом метода <code>gather()</code>. Если мы этого не сделаем, оценка либо выдаст ошибку, либо зависнет навсегда.',al,kl,Il,r,Q,ol,ee='После этого у вас должна получиться модель, результаты которой будут очень похожи на модель, обученную с помощью <code>Seq2SeqTrainer</code>. Вы можете проверить модель, которую мы обучили с помощью этого кода, на <a href="https://huggingface.co/huggingface-course/marian-finetuned-kde4-en-to-fr-accelerate" rel="nofollow"><em>huggingface-course/marian-finetuned-kde4-en-to-fr-accelerate</em></a>. А если вы хотите протестировать какие-либо изменения в цикле обучения, вы можете реализовать их напрямую, отредактировав код, показанный выше!',Vl;return M=new Rl({props:{title:"Индивидуальный цикл обучения",local:"a-custom-training-loop",headingTag:"h2"}}),u=new Rl({props:{title:"Подготовка всего к обучению",local:"preparing-everything-for-training",headingTag:"h3"}}),C=new h({props:{code:"ZnJvbSUyMHRvcmNoLnV0aWxzLmRhdGElMjBpbXBvcnQlMjBEYXRhTG9hZGVyJTBBJTBBdG9rZW5pemVkX2RhdGFzZXRzLnNldF9mb3JtYXQoJTIydG9yY2glMjIpJTBBdHJhaW5fZGF0YWxvYWRlciUyMCUzRCUyMERhdGFMb2FkZXIoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDglMkMlMEEpJTBBZXZhbF9kYXRhbG9hZGVyJTIwJTNEJTIwRGF0YUxvYWRlciglMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTJDJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMjBiYXRjaF9zaXplJTNEOCUwQSk=",highlighted:`<span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader

tokenized_datasets.set_format(<span class="hljs-string">&quot;torch&quot;</span>)
train_dataloader = DataLoader(
    tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>],
    shuffle=<span class="hljs-literal">True</span>,
    collate_fn=data_collator,
    batch_size=<span class="hljs-number">8</span>,
)
eval_dataloader = DataLoader(
    tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>], collate_fn=data_collator, batch_size=<span class="hljs-number">8</span>
)`,wrap:!1}}),H=new h({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JTZXEyU2VxTE0uZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NoZWNrcG9pbnQp",highlighted:"model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)",wrap:!1}}),Y=new h({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltJTIwaW1wb3J0JTIwQWRhbVclMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBBZGFtVyhtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDJlLTUp",highlighted:`<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW

optimizer = AdamW(model.parameters(), lr=<span class="hljs-number">2e-5</span>)`,wrap:!1}}),E=new h({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoKSUwQW1vZGVsJTJDJTIwb3B0aW1pemVyJTJDJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`,wrap:!1}}),el=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGdldF9zY2hlZHVsZXIlMEElMEFudW1fdHJhaW5fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV91cGRhdGVfc3RlcHNfcGVyX2Vwb2NoJTIwJTNEJTIwbGVuKHRyYWluX2RhdGFsb2FkZXIpJTBBbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX3RyYWluX2Vwb2NocyUyMColMjBudW1fdXBkYXRlX3N0ZXBzX3Blcl9lcG9jaCUwQSUwQWxyX3NjaGVkdWxlciUyMCUzRCUyMGdldF9zY2hlZHVsZXIoJTBBJTIwJTIwJTIwJTIwJTIybGluZWFyJTIyJTJDJTBBJTIwJTIwJTIwJTIwb3B0aW1pemVyJTNEb3B0aW1pemVyJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5pbmdfc3RlcHMlM0RudW1fdHJhaW5pbmdfc3RlcHMlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> get_scheduler

num_train_epochs = <span class="hljs-number">3</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(
    <span class="hljs-string">&quot;linear&quot;</span>,
    optimizer=optimizer,
    num_warmup_steps=<span class="hljs-number">0</span>,
    num_training_steps=num_training_steps,
)`,wrap:!1}}),wl=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMFJlcG9zaXRvcnklMkMlMjBnZXRfZnVsbF9yZXBvX25hbWUlMEElMEFtb2RlbF9uYW1lJTIwJTNEJTIwJTIybWFyaWFuLWZpbmV0dW5lZC1rZGU0LWVuLXRvLWZyLWFjY2VsZXJhdGUlMjIlMEFyZXBvX25hbWUlMjAlM0QlMjBnZXRfZnVsbF9yZXBvX25hbWUobW9kZWxfbmFtZSklMEFyZXBvX25hbWU=",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;marian-finetuned-kde4-en-to-fr-accelerate&quot;</span>
repo_name = get_full_repo_name(model_name)
repo_name`,wrap:!1}}),Jl=new h({props:{code:"J3NndWdnZXIlMkZtYXJpYW4tZmluZXR1bmVkLWtkZTQtZW4tdG8tZnItYWNjZWxlcmF0ZSc=",highlighted:'<span class="hljs-string">&#x27;sgugger/marian-finetuned-kde4-en-to-fr-accelerate&#x27;</span>',wrap:!1}}),F=new h({props:{code:"b3V0cHV0X2RpciUyMCUzRCUyMCUyMm1hcmlhbi1maW5ldHVuZWQta2RlNC1lbi10by1mci1hY2NlbGVyYXRlJTIyJTBBcmVwbyUyMCUzRCUyMFJlcG9zaXRvcnkob3V0cHV0X2RpciUyQyUyMGNsb25lX2Zyb20lM0RyZXBvX25hbWUp",highlighted:`output_dir = <span class="hljs-string">&quot;marian-finetuned-kde4-en-to-fr-accelerate&quot;</span>
repo = Repository(output_dir, clone_from=repo_name)`,wrap:!1}}),rl=new Rl({props:{title:"Цикл обучения",local:"training-loop",headingTag:"h3"}}),D=new h({props:{code:"ZGVmJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnMlMkMlMjBsYWJlbHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBwcmVkaWN0aW9ucy5jcHUoKS5udW1weSgpJTBBJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwbGFiZWxzLmNwdSgpLm51bXB5KCklMEElMEElMjAlMjAlMjAlMjBkZWNvZGVkX3ByZWRzJTIwJTNEJTIwdG9rZW5pemVyLmJhdGNoX2RlY29kZShwcmVkaWN0aW9ucyUyQyUyMHNraXBfc3BlY2lhbF90b2tlbnMlM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCU5NyVEMCVCMCVEMCVCQyVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCQyUyMC0xMDAlMjAlRDAlQjIlMjAlRDAlQkMlRDAlQjUlRDElODIlRDAlQkElRDAlQjAlRDElODUlMkMlMjAlRDElODIlRDAlQjAlRDAlQkElMjAlRDAlQkElRDAlQjAlRDAlQkElMjAlRDAlQkMlRDElOEIlMjAlRDAlQkQlRDAlQjUlMjAlRDAlQkMlRDAlQkUlRDAlQjYlRDAlQjUlRDAlQkMlMjAlRDAlQjglRDElODUlMjAlRDAlQjQlRDAlQjUlRDAlQkElRDAlQkUlRDAlQjQlRDAlQjglRDElODAlRDAlQkUlRDAlQjIlRDAlQjAlRDElODIlRDElOEMuJTBBJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwbnAud2hlcmUobGFiZWxzJTIwISUzRCUyMC0xMDAlMkMlMjBsYWJlbHMlMkMlMjB0b2tlbml6ZXIucGFkX3Rva2VuX2lkKSUwQSUyMCUyMCUyMCUyMGRlY29kZWRfbGFiZWxzJTIwJTNEJTIwdG9rZW5pemVyLmJhdGNoX2RlY29kZShsYWJlbHMlMkMlMjBza2lwX3NwZWNpYWxfdG9rZW5zJTNEVHJ1ZSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjAlRDAlOUQlRDAlQjUlRDAlQkMlRDAlQkQlRDAlQkUlRDAlQjMlRDAlQkUlMjAlRDAlQkYlRDElODAlRDAlQkUlRDElODElRDElODIlRDAlQkUlRDAlQjklMjAlRDAlQkYlRDAlQkUlRDElODElRDElODIlRDAlQkUlRDAlQjElRDElODAlRDAlQjAlRDAlQjElRDAlQkUlRDElODIlRDAlQkElRDAlQjglMEElMjAlMjAlMjAlMjBkZWNvZGVkX3ByZWRzJTIwJTNEJTIwJTVCcHJlZC5zdHJpcCgpJTIwZm9yJTIwcHJlZCUyMGluJTIwZGVjb2RlZF9wcmVkcyU1RCUwQSUyMCUyMCUyMCUyMGRlY29kZWRfbGFiZWxzJTIwJTNEJTIwJTVCJTVCbGFiZWwuc3RyaXAoKSU1RCUyMGZvciUyMGxhYmVsJTIwaW4lMjBkZWNvZGVkX2xhYmVscyU1RCUwQSUyMCUyMCUyMCUyMHJldHVybiUyMGRlY29kZWRfcHJlZHMlMkMlMjBkZWNvZGVkX2xhYmVscw==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">postprocess</span>(<span class="hljs-params">predictions, labels</span>):
    predictions = predictions.cpu().numpy()
    labels = labels.cpu().numpy()

    decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Заменим -100 в метках, так как мы не можем их декодировать.</span>
    labels = np.where(labels != -<span class="hljs-number">100</span>, labels, tokenizer.pad_token_id)
    decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Немного простой постобработки</span>
    decoded_preds = [pred.strip() <span class="hljs-keyword">for</span> pred <span class="hljs-keyword">in</span> decoded_preds]
    decoded_labels = [[label.strip()] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> decoded_labels]
    <span class="hljs-keyword">return</span> decoded_preds, decoded_labels`,wrap:!1}}),kl=new h({props:{code:" ",highlighted:`<span class="hljs-keyword">from</span> tqdm.auto <span class="hljs-keyword">import</span> tqdm
<span class="hljs-keyword">import</span> torch

progress_bar = tqdm(<span class="hljs-built_in">range</span>(num_training_steps))

<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-comment"># Обучение</span>
    model.train()
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(<span class="hljs-number">1</span>)

    <span class="hljs-comment"># Оценка</span>
    model.<span class="hljs-built_in">eval</span>()
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> tqdm(eval_dataloader):
        <span class="hljs-keyword">with</span> torch.no_grad():
            generated_tokens = accelerator.unwrap_model(model).generate(
                batch[<span class="hljs-string">&quot;input_ids&quot;</span>],
                attention_mask=batch[<span class="hljs-string">&quot;attention_mask&quot;</span>],
                max_length=<span class="hljs-number">128</span>,
            )
        labels = batch[<span class="hljs-string">&quot;labels&quot;</span>]

        <span class="hljs-comment">## Необходимо дополнить прогнозы и метки</span>
        generated_tokens = accelerator.pad_across_processes(
            generated_tokens, dim=<span class="hljs-number">1</span>, pad_index=tokenizer.pad_token_id
        )
        labels = accelerator.pad_across_processes(labels, dim=<span class="hljs-number">1</span>, pad_index=-<span class="hljs-number">100</span>)

        predictions_gathered = accelerator.gather(generated_tokens)
        labels_gathered = accelerator.gather(labels)

        decoded_preds, decoded_labels = postprocess(predictions_gathered, labels_gathered)
        metric.add_batch(predictions=decoded_preds, references=decoded_labels)

    results = metric.compute()
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;epoch <span class="hljs-subst">{epoch}</span>, BLEU score: <span class="hljs-subst">{results[<span class="hljs-string">&#x27;score&#x27;</span>]:<span class="hljs-number">.2</span>f}</span>&quot;</span>)

    <span class="hljs-comment"># Сохранение и загрузка</span>
    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 epoch <span class="hljs-subst">{epoch}</span>&quot;</span>, blocking=<span class="hljs-literal">False</span>
        )`,wrap:!1}}),r=new h({props:{code:"ZXBvY2glMjAwJTJDJTIwQkxFVSUyMHNjb3JlJTNBJTIwNTMuNDclMEFlcG9jaCUyMDElMkMlMjBCTEVVJTIwc2NvcmUlM0ElMjA1NC4yNCUwQWVwb2NoJTIwMiUyQyUyMEJMRVUlMjBzY29yZSUzQSUyMDU0LjQ0",highlighted:`epoch <span class="hljs-number">0</span>, BLEU score: <span class="hljs-number">53.47</span>
epoch <span class="hljs-number">1</span>, BLEU score: <span class="hljs-number">54.24</span>
epoch <span class="hljs-number">2</span>, BLEU score: <span class="hljs-number">54.44</span>`,wrap:!1}}),{c(){m(M.$$.fragment),b=n(),J=c("p"),J.innerHTML=f,g=n(),m(u.$$.fragment),R=n(),x=c("p"),x.innerHTML=_,$=n(),m(C.$$.fragment),V=n(),K=c("p"),K.textContent=ml,X=n(),m(H.$$.fragment),L=n(),B=c("p"),B.textContent=Tl,W=n(),m(Y.$$.fragment),P=n(),N=c("p"),N.innerHTML=$l,O=n(),m(E.$$.fragment),ll=n(),v=c("p"),v.innerHTML=A,pl=n(),m(el.$$.fragment),G=n(),d=c("p"),d.innerHTML=Z,sl=n(),m(wl.$$.fragment),Ul=n(),m(Jl.$$.fragment),dl=n(),z=c("p"),z.textContent=Fl,fl=n(),m(F.$$.fragment),bl=n(),S=c("p"),S.innerHTML=Yl,cl=n(),m(rl.$$.fragment),hl=n(),q=c("p"),q.innerHTML=Sl,Cl=n(),m(D.$$.fragment),xl=n(),tl=c("p"),tl.innerHTML=gl,_l=n(),nl=c("p"),nl.innerHTML=jl,yl=n(),il=c("p"),il.innerHTML=Zl,al=n(),m(kl.$$.fragment),Il=n(),m(r.$$.fragment),Q=n(),ol=c("p"),ol.innerHTML=ee},l(p){T(M.$$.fragment,p),b=a(p),J=y(p,"P",{"data-svelte-h":!0}),o(J)!=="svelte-cws5v6"&&(J.innerHTML=f),g=a(p),T(u.$$.fragment,p),R=a(p),x=y(p,"P",{"data-svelte-h":!0}),o(x)!=="svelte-1cwvy28"&&(x.innerHTML=_),$=a(p),T(C.$$.fragment,p),V=a(p),K=y(p,"P",{"data-svelte-h":!0}),o(K)!=="svelte-2pp13n"&&(K.textContent=ml),X=a(p),T(H.$$.fragment,p),L=a(p),B=y(p,"P",{"data-svelte-h":!0}),o(B)!=="svelte-yaabe1"&&(B.textContent=Tl),W=a(p),T(Y.$$.fragment,p),P=a(p),N=y(p,"P",{"data-svelte-h":!0}),o(N)!=="svelte-j7nvq8"&&(N.innerHTML=$l),O=a(p),T(E.$$.fragment,p),ll=a(p),v=y(p,"P",{"data-svelte-h":!0}),o(v)!=="svelte-mvu9yg"&&(v.innerHTML=A),pl=a(p),T(el.$$.fragment,p),G=a(p),d=y(p,"P",{"data-svelte-h":!0}),o(d)!=="svelte-njqa"&&(d.innerHTML=Z),sl=a(p),T(wl.$$.fragment,p),Ul=a(p),T(Jl.$$.fragment,p),dl=a(p),z=y(p,"P",{"data-svelte-h":!0}),o(z)!=="svelte-8lcf8w"&&(z.textContent=Fl),fl=a(p),T(F.$$.fragment,p),bl=a(p),S=y(p,"P",{"data-svelte-h":!0}),o(S)!=="svelte-2q65e7"&&(S.innerHTML=Yl),cl=a(p),T(rl.$$.fragment,p),hl=a(p),q=y(p,"P",{"data-svelte-h":!0}),o(q)!=="svelte-95kgoq"&&(q.innerHTML=Sl),Cl=a(p),T(D.$$.fragment,p),xl=a(p),tl=y(p,"P",{"data-svelte-h":!0}),o(tl)!=="svelte-xfwd3w"&&(tl.innerHTML=gl),_l=a(p),nl=y(p,"P",{"data-svelte-h":!0}),o(nl)!=="svelte-ofpmr7"&&(nl.innerHTML=jl),yl=a(p),il=y(p,"P",{"data-svelte-h":!0}),o(il)!=="svelte-1qki2nb"&&(il.innerHTML=Zl),al=a(p),T(kl.$$.fragment,p),Il=a(p),T(r.$$.fragment,p),Q=a(p),ol=y(p,"P",{"data-svelte-h":!0}),o(ol)!=="svelte-1asy5my"&&(ol.innerHTML=ee)},m(p,I){w(M,p,I),s(p,b,I),s(p,J,I),s(p,g,I),w(u,p,I),s(p,R,I),s(p,x,I),s(p,$,I),w(C,p,I),s(p,V,I),s(p,K,I),s(p,X,I),w(H,p,I),s(p,L,I),s(p,B,I),s(p,W,I),w(Y,p,I),s(p,P,I),s(p,N,I),s(p,O,I),w(E,p,I),s(p,ll,I),s(p,v,I),s(p,pl,I),w(el,p,I),s(p,G,I),s(p,d,I),s(p,sl,I),w(wl,p,I),s(p,Ul,I),w(Jl,p,I),s(p,dl,I),s(p,z,I),s(p,fl,I),w(F,p,I),s(p,bl,I),s(p,S,I),s(p,cl,I),w(rl,p,I),s(p,hl,I),s(p,q,I),s(p,Cl,I),w(D,p,I),s(p,xl,I),s(p,tl,I),s(p,_l,I),s(p,nl,I),s(p,yl,I),s(p,il,I),s(p,al,I),w(kl,p,I),s(p,Il,I),w(r,p,I),s(p,Q,I),s(p,ol,I),Vl=!0},i(p){Vl||(i(M.$$.fragment,p),i(u.$$.fragment,p),i(C.$$.fragment,p),i(H.$$.fragment,p),i(Y.$$.fragment,p),i(E.$$.fragment,p),i(el.$$.fragment,p),i(wl.$$.fragment,p),i(Jl.$$.fragment,p),i(F.$$.fragment,p),i(rl.$$.fragment,p),i(D.$$.fragment,p),i(kl.$$.fragment,p),i(r.$$.fragment,p),Vl=!0)},o(p){U(M.$$.fragment,p),U(u.$$.fragment,p),U(C.$$.fragment,p),U(H.$$.fragment,p),U(Y.$$.fragment,p),U(E.$$.fragment,p),U(el.$$.fragment,p),U(wl.$$.fragment,p),U(Jl.$$.fragment,p),U(F.$$.fragment,p),U(rl.$$.fragment,p),U(D.$$.fragment,p),U(kl.$$.fragment,p),U(r.$$.fragment,p),Vl=!1},d(p){p&&(e(b),e(J),e(g),e(R),e(x),e($),e(V),e(K),e(X),e(L),e(B),e(W),e(P),e(N),e(O),e(ll),e(v),e(pl),e(G),e(d),e(sl),e(Ul),e(dl),e(z),e(fl),e(bl),e(S),e(cl),e(hl),e(q),e(Cl),e(xl),e(tl),e(_l),e(nl),e(yl),e(il),e(al),e(Il),e(Q),e(ol)),j(M,p),j(u,p),j(C,p),j(H,p),j(Y,p),j(E,p),j(el,p),j(wl,p),j(Jl,p),j(F,p),j(rl,p),j(D,p),j(kl,p),j(r,p)}}}function mM(k){let M,b="✏️ <strong>Попробуйте!</strong> Что возвращает модель для примера со словом “email”, который вы определили ранее?";return{c(){M=c("p"),M.innerHTML=b},l(J){M=y(J,"P",{"data-svelte-h":!0}),o(M)!=="svelte-1cd40ew"&&(M.innerHTML=b)},m(J,f){s(J,M,f)},p:zl,d(J){J&&e(M)}}}function TM(k){let M,b,J,f,g,u,R,x,_,$,C,V,K='Теперь давайте погрузимся в перевод. Это еще одна <a href="../chapter1/7">задача преобразования последовательности в последовательность (sequence-to-sequence)</a>, что означает, что это проблема, которую можно сформулировать как переход от одной последовательности к другой. В этом смысле задача очень близка к <a href="../chapter7/6">резюмированию (summarization)</a>, и вы можете приспособить то, что мы здесь рассмотрим, к другим задачам преобразования последовательности в последовательность, таким как:',ml,X,H="<li><strong>Перенос стиля (Style transfer)</strong>: Создание модели, которая <em>переводит</em> тексты, написанные в определенном стиле, в другой (например, из формального в повседневный или из шекспировского английского в современный).</li> <li><strong>Генеративные ответы на вопросы (Generative question answering)</strong>: Создание модели, которая генерирует ответы на вопросы, учитывая контекст</li>",L,B,Tl,W,Y='Если у вас есть достаточно большой корпус текстов на двух (или более) языках, вы можете обучить новую модель перевода с нуля, как мы это сделаем в разделе по <a href="../chapter7/6">казуальному языковому моделированию (causal language modeling)</a>. Однако быстрее будет дообучить существующую модель перевода, будь то многоязычная модель типа mT5 или mBART, которую нужно дообучить для конкретной пары языков, или даже модель, специализированная для перевода с одного языка на другой, которую нужно дообучить для конкретного корпуса.',P,N,$l='В этом разделе мы дообучим модель Marian, предварительно обученную переводу с английского на французский (поскольку многие сотрудники Hugging Face говорят на обоих этих языках), на датасете <a href="https://huggingface.co/datasets/kde4" rel="nofollow">KDE4</a>, который представляет собой набор локализованных файлов для приложений <a href="https://apps.kde.org/" rel="nofollow">KDE</a>. Модель, которую мы будем использовать, была предварительно обучена на большом корпусе французских и английских текстов, взятых из <a href="https://opus.nlpl.eu/" rel="nofollow">Opus dataset</a>, который фактически содержит датасет KDE4. Но даже если модель, которую мы используем, видела эти данные во время предварительного обучения, мы увидим, что после дообучения мы сможем получить ее лучшую версию.',O,E,ll="Когда мы закончим, у нас будет модель, способная делать прогнозы, подобные этому:",v,A,pl,el,G,d='<img class="block dark:hidden lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/modeleval-marian-finetuned-kde4-en-to-fr.png" alt="One-hot encoded labels for question answering."/> <img class="hidden dark:block lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/modeleval-marian-finetuned-kde4-en-to-fr-dark.png" alt="One-hot encoded labels for question answering."/>',Z,sl,wl='Как и в предыдущих разделах, вы можете найти актуальную модель, которую мы обучим и загрузим на Hub, используя приведенный ниже код, и перепроверить ее предсказания <a href="https://huggingface.co/huggingface-course/marian-finetuned-kde4-en-to-fr?text=This+plugin+allows+you+to+automatically+translate+web+pages+between+several+languages." rel="nofollow">здесь</a>.',Ul,Jl,dl,z,Fl='Чтобы дообучить или обучить модель перевода с нуля, нам понадобится датасет, подходящий для этой задачи. Как уже упоминалось, мы будем использовать <a href="https://huggingface.co/datasets/kde4" rel="nofollow">датасет KDE4</a> , но вы можете легко адаптировать код для использования своих собственных данных, если у вас есть пары предложений на двух языках, с которых вы хотите переводить и на которые хотите переводить. Обратитесь к <a href="../chapter5/1">Главе 5</a> если вам нужно вспомнить, как загружать пользовательские данные в <code>Dataset</code>.',fl,F,bl,S,Yl="Как обычно, мы загружаем наш датасет с помощью функции <code>load_dataset()</code>:",cl,rl,hl,q,Sl='Если вы хотите работать с другой парой языков, вы можете указать их по кодам. Всего для этого датасета доступно 92 языка; вы можете увидеть их все, развернув языковые теги в его <a href="https://huggingface.co/datasets/kde4" rel="nofollow">карточке датасета</a>.',Cl,D,xl,tl,gl,_l="Давайте посмотрим на датасет:",nl,jl,yl,il,Zl,al,kl='У нас есть 210 173 пары предложений, но в одной части, поэтому нам нужно создать собственный проверочный набор. Как мы видели в <a href="../chapter5/1">Главе 5</a>, у <code>Dataset</code> есть метод <code>train_test_split()</code>, который может нам помочь. Мы зададим seed для воспроизводимости:',Il,r,Q,ol,ee,Vl,p="Мы можем переименовать ключ <code>&quot;test&quot;</code> в <code>&quot;validation&quot;</code> следующим образом:",I,se,Fs,te,Gn="Теперь давайте рассмотрим один элемент датасета:",Ss,ne,qs,ae,Ls,Me,Bn="Мы получаем словарь с двумя предложениями на запрошенной паре языков. Одна из особенностей этого датасета, наполненного техническими терминами в области компьютерных наук, заключается в том, что все они полностью переведены на французский язык. Однако французские инженеры при разговоре оставляют большинство специфических для компьютерных наук слов на английском. Например, слово “threads” вполне может встретиться во французском предложении, особенно в техническом разговоре; но в данном датасете оно переведено как более правильное “fils de discussion”. Используемая нами модель, предварительно обученная на большем корпусе французских и английских предложений, выбирает более простой вариант - оставить слово как есть:",Ps,pe,Os,Je,Ks,re,Nn=`Другой пример такого поведения можно увидеть на примере слова “plugin”, которое официально не является французским словом, но большинство носителей языка поймут его и не станут переводить.
В датасете KDE4 это слово было переведено на французский как более официальное “module d’extension”:`,lt,ie,et,Ue,st,ce,Xn="Однако наша предварительно обученная модель придерживается компактного и знакомого английского слова:",tt,ye,nt,me,at,Te,Wn="Будет интересно посмотреть, сможет ли наша дообученная модель уловить эти особенности датасета (спойлер: сможет).",Mt,we,pt,ql,Jt,je,rt,oe,it,ue,vn='Вы уже должны знать, как это делается: все тексты нужно преобразовать в наборы идентификаторов токенов, чтобы модель могла понять их смысл. Для этой задачи нам понадобится токенизация как входных данных, так и целевых. Наша первая задача - создать объект <code>tokenizer</code>. Как отмечалось ранее, мы будем использовать предварительно обученную модель Marian English to French. Если вы будете пробовать этот код с другой парой языков, обязательно адаптируйте контрольную точку модели. Организация <a href="https://huggingface.co/Helsinki-NLP" rel="nofollow">Helsinki-NLP</a> предоставляет более тысячи моделей на разных языках.',Ut,de,ct,fe,Dn='Вы также можете заменить <code>model_checkpoint</code> на любую другую модель из <a href="https://huggingface.co/models" rel="nofollow">Hub</a> или локальной папки, в которой вы сохранили предварительно обученную модель и токенизатор.',yt,Ll,mt,be,Hn="Подготовка наших данных довольно проста. Нужно помнить только об одном: необходимо убедиться, что токенизатор обрабатывает целевые значения на выходном языке (здесь - французском). Вы можете сделать это, передав целевые данные в аргумент <code>text_targets</code> метода <code>__call__</code> токенизатора.",Tt,he,Yn="Чтобы увидеть, как это работает, давайте обработаем по одному примеру каждого языка из обучающего набора:",wt,Ce,jt,Ie,ot,Qe,zn="Как мы видим, в выходных данных содержатся входные идентификаторы, связанные с английским предложением, а идентификаторы, связанные с французским, хранятся в поле <code>labels</code>. Если вы забудете указать, что выполняете токенизацию меток, они будут токенизированы входным токенизатором, что в случае с моделью Marian не приведет ни к чему хорошему:",ut,$e,dt,ge,ft,ke,Fn="Как мы видим, при использовании английского токенизатора для предварительной обработки французского предложения получается гораздо больше токенов, поскольку токенизатор не знает ни одного французского слова (кроме тех, которые также встречаются в английском языке, например “discussion”).",bt,Re,Sn="Поскольку <code>inputs</code> - это словарь с нашими обычными ключами (идентификаторы входных данных, маска внимания и т. д.), последним шагом будет определение функции предварительной обработки, которую мы будем применять к датасетам:",ht,xe,Ct,_e,qn="Обратите внимание, что мы установили одинаковую максимальную длину для наших входов и выходов. Поскольку тексты, с которыми мы имеем дело, довольно короткие, мы используем 128.",It,Pl,Qt,Ol,$t,Ze,Ln="Теперь мы можем применить эту функцию предварительной обработки ко всем частям нашего датасета за один раз:",gt,Ve,kt,Ae,Pn="Теперь, когда данные прошли предварительную обработку, мы готовы дообучить нашу предварительно обученную модель!",Rt,Al,El,Ns,Ee,On="Обратите внимание, что в этот раз мы используем модель, которая была обучена на задаче перевода и фактически уже может быть использована, поэтому нет предупреждения о пропущенных или новых инициализированных весах.",xt,Ge,_t,Be,Kn='Для динамического батча нам понадобится коллатор данных для работы с дополнением (padding). Мы не можем просто использовать <code>DataCollatorWithPadding</code>, как в <a href="../chapter3/1">Главе 3</a>, потому что в этом случае будут заполнены только входы (идентификаторы входов, маска внимания и идентификаторы типов токенов). Наши метки также должны быть дополнены до максимальной длины, встречающейся в метках. И, как уже говорилось, добовляемое значение, используемое для дополнения меток, должно быть <code>-100</code>, а не добавочный токен токенизатора, чтобы эти добавочные значения игнорировались при вычислении потерь.',Zt,Ne,la='Все это делает <a href="https://huggingface.co/transformers/main_classes/data_collator.html#datacollatorforseq2seq" rel="nofollow"><code>DataCollatorForSeq2Seq</code></a>. Как и <code>DataCollatorWithPadding</code>, он принимает <code>tokenizer</code>, используемый для препроцессирования входных данных, а также <code>model</code>. Это связано с тем, что данный коллатор данных также будет отвечать за подготовку входных идентификаторов декодера, которые представляют собой сдвинутые версии меток со специальным токеном в начале. Поскольку для разных архитектур этот сдвиг выполняется по-разному, <code>DataCollatorForSeq2Seq</code> должен знать объект <code>model</code>:',Vt,Gl,Bl,Xs,Xe,ea="Чтобы протестировать его на нескольких примерах, мы просто вызываем его на списке примеров из нашего токинезированного обучающего набора:",At,We,Et,ve,Gt,De,sa="Мы можем проверить, что наши метки были дополнены до максимальной длины батча, с использованием <code>-100</code>:",Bt,He,Nt,Ye,Xt,ze,ta="Также мы можем взглянуть на идентификаторы входов декодера и убедиться, что они являются сдвинутыми версиями меток:",Wt,Fe,vt,Se,Dt,qe,na="Вот метки для первого и второго элементов в нашем датасете:",Ht,Le,Yt,Pe,zt,Nl,Xl,Ws,Oe,Ft,Ke,St,vs,ls,aa='Традиционной метрикой, используемой для перевода, является <a href="https://en.wikipedia.org/wiki/BLEU" rel="nofollow">BLEU score</a>, представленная в <a href="https://aclanthology.org/P02-1040.pdf" rel="nofollow">статье 2002 года</a> Кишором Папинени и др. BLEU score оценивает, насколько близки переводы к своим меткам. Он не измеряет разборчивость или грамматическую правильность сгенерированных моделью результатов, но использует статистические правила, чтобы гарантировать, что все слова в сгенерированных результатах также встречаются в целевых. Кроме того, существуют правила, наказывающие повторы одних и тех же слов, если они не повторяются в целевых словах (чтобы модель не выводила предложения типа <code>&quot;the the the the the the the&quot;), и вывод предложений, которые короче, чем целевые (чтобы модель не выводила предложения типа </code>“the”`).',qt,es,Ma='Один из недостатков BLEU заключается в том, что она предполагает, что текст уже прошел токенизацию, что затрудняет сравнение оценок между моделями, использующими различные токенизаторы. Поэтому сегодня для сравнения моделей перевода чаще всего используется метрика <a href="https://github.com/mjpost/sacrebleu" rel="nofollow">SacreBLEU</a>, которая устраняет этот недостаток (и другие) путем стандартизации этапа токенизации. Чтобы использовать эту метрику, сначала нужно установить библиотеку SacreBLEU:',Lt,ss,Pt,ts,pa='Затем мы можем загрузить ее с помощью <code>evaluate.load()</code>, как мы это делали в <a href="../chapter3/1">Главе 3</a>:',Ot,ns,Kt,as,Ja="Эта метрика принимает тексты в качестве входных и целевых данных. Она рассчитана на использование нескольких приемлемых целей, так как часто существует несколько приемлемых переводов одного и того же предложения - в используемом нами датасете есть только один, но в NLP нередко встречаются датасеты, дающие несколько предложений в качестве меток. Таким образом, прогнозы должны представлять собой список предложений, а ссылки - список списков предложений.",ln,Ms,ra="Попробуем рассмотреть пример:",en,ps,sn,Js,tn,rs,ia='Это дает оценку BLEU 46,75, что довольно хорошо - для сравнения, оригинальная модель Transformer в статье <a href="https://arxiv.org/pdf/1706.03762.pdf" rel="nofollow">“Attention Is All You Need” paper</a> достигла оценки BLEU 41,8 на аналогичной задаче перевода с английского на французский! (Более подробную информацию об отдельных метриках, таких как <code>counts</code> и <code>bp</code>, можно найти в репозитории <a href="https://github.com/mjpost/sacrebleu/blob/078c440168c6adc89ba75fe6d63f0d922d42bcfe/sacrebleu/metrics/bleu.py#L74" rel="nofollow">SacreBLEU</a>). С другой стороны, если мы попробуем использовать два плохих типа предсказаний (много повторов или слишком короткие), которые часто получаются в моделях перевода, мы получим довольно плохие оценки BLEU:',nn,is,an,Us,Mn,cs,pn,ys,Jn,ms,Ua="Оценка может варьироваться от 0 до 100, причем чем больше, тем лучше.",rn,Wl,vl,Ds,Ts,ca="Теперь, когда все готово, мы готовы дообучить нашу модель!",Un,ws,cn,js,ya="Первый шаг - войти в Hugging Face, чтобы загрузить результаты в Model Hub. В блокноте есть удобная функция, которая поможет вам в этом:",yn,os,mn,us,ma="Появится виджет, в котором вы можете ввести свои учетные данные для входа в Hugging Face.",Tn,ds,Ta="Если вы работаете не в блокноте, просто введите следующую строку в терминале:",wn,fs,jn,Dl,Hl,Hs,Ys,bs,on,hs,wa="Мы уже показали вам, как можно использовать модель, которую мы дообучили на Model Hub, с помощью виджета инференса. Чтобы использовать ее локально в <code>pipeline</code>, нам просто нужно указать соответствующий идентификатор модели:",un,Cs,dn,Is,fn,Qs,ja="Как и ожидалось, наша предварительно обученная модель адаптировала свои знания к корпусу, на котором мы ее дообучили, и вместо того, чтобы оставить английское слово “threads” в покое, она теперь переводит его на официальный французский вариант. То же самое относится и к слову ” plugin “:",bn,$s,hn,gs,Cn,ks,oa="Еще один отличный пример доменной адаптации!",In,Kl,Qn,Rs,$n,zs,gn;g=new Fa({props:{fw:k[0]}}),R=new Rl({props:{title:"Перевод",local:"translation",headingTag:"h1"}});const ua=[La,qa],xs=[];function da(l,t){return l[0]==="pt"?0:1}_=da(k),$=xs[_]=ua[_](k),B=new kn({props:{id:"1JvfrvZgi6c"}}),Jl=new Rl({props:{title:"Подготовка данных",local:"preparing-the-data",headingTag:"h2"}}),F=new Rl({props:{title:"Датасет KDE4",local:"the-kde4-dataset",headingTag:"h3"}}),rl=new h({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBcmF3X2RhdGFzZXRzJTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMmtkZTQlMjIlMkMlMjBsYW5nMSUzRCUyMmVuJTIyJTJDJTIwbGFuZzIlM0QlMjJmciUyMik=",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

raw_datasets = load_dataset(<span class="hljs-string">&quot;kde4&quot;</span>, lang1=<span class="hljs-string">&quot;en&quot;</span>, lang2=<span class="hljs-string">&quot;fr&quot;</span>)`,wrap:!1}}),jl=new h({props:{code:"cmF3X2RhdGFzZXRz",highlighted:"raw_datasets",wrap:!1}}),il=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2lkJyUyQyUyMCd0cmFuc2xhdGlvbiclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDIxMDE3MyUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;translation&#x27;</span>],
        num_rows: <span class="hljs-number">210173</span>
    })
})`,wrap:!1}}),r=new h({props:{code:"c3BsaXRfZGF0YXNldHMlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RC50cmFpbl90ZXN0X3NwbGl0KHRyYWluX3NpemUlM0QwLjklMkMlMjBzZWVkJTNEMjApJTBBc3BsaXRfZGF0YXNldHM=",highlighted:`split_datasets = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>].train_test_split(train_size=<span class="hljs-number">0.9</span>, seed=<span class="hljs-number">20</span>)
split_datasets`,wrap:!1}}),ol=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2lkJyUyQyUyMCd0cmFuc2xhdGlvbiclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE4OTE1NSUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB0ZXN0JTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidpZCclMkMlMjAndHJhbnNsYXRpb24nJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjAyMTAxOCUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;translation&#x27;</span>],
        num_rows: <span class="hljs-number">189155</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;translation&#x27;</span>],
        num_rows: <span class="hljs-number">21018</span>
    })
})`,wrap:!1}}),se=new h({props:{code:"c3BsaXRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTIwJTNEJTIwc3BsaXRfZGF0YXNldHMucG9wKCUyMnRlc3QlMjIp",highlighted:'split_datasets[<span class="hljs-string">&quot;validation&quot;</span>] = split_datasets.pop(<span class="hljs-string">&quot;test&quot;</span>)',wrap:!1}}),ne=new h({props:{code:"c3BsaXRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjElNUQlNUIlMjJ0cmFuc2xhdGlvbiUyMiU1RA==",highlighted:'split_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">1</span>][<span class="hljs-string">&quot;translation&quot;</span>]',wrap:!1}}),ae=new h({props:{code:"JTdCJ2VuJyUzQSUyMCdEZWZhdWx0JTIwdG8lMjBleHBhbmRlZCUyMHRocmVhZHMnJTJDJTBBJTIwJ2ZyJyUzQSUyMCdQYXIlMjBkJUMzJUE5ZmF1dCUyQyUyMGQlQzMlQTl2ZWxvcHBlciUyMGxlcyUyMGZpbHMlMjBkZSUyMGRpc2N1c3Npb24nJTdE",highlighted:`{<span class="hljs-string">&#x27;en&#x27;</span>: <span class="hljs-string">&#x27;Default to expanded threads&#x27;</span>,
 <span class="hljs-string">&#x27;fr&#x27;</span>: <span class="hljs-string">&#x27;Par défaut, développer les fils de discussion&#x27;</span>}`,wrap:!1}}),pe=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMkhlbHNpbmtpLU5MUCUyRm9wdXMtbXQtZW4tZnIlMjIlMEF0cmFuc2xhdG9yJTIwJTNEJTIwcGlwZWxpbmUoJTIydHJhbnNsYXRpb24lMjIlMkMlMjBtb2RlbCUzRG1vZGVsX2NoZWNrcG9pbnQpJTBBdHJhbnNsYXRvciglMjJEZWZhdWx0JTIwdG8lMjBleHBhbmRlZCUyMHRocmVhZHMlMjIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

model_checkpoint = <span class="hljs-string">&quot;Helsinki-NLP/opus-mt-en-fr&quot;</span>
translator = pipeline(<span class="hljs-string">&quot;translation&quot;</span>, model=model_checkpoint)
translator(<span class="hljs-string">&quot;Default to expanded threads&quot;</span>)`,wrap:!1}}),Je=new h({props:{code:"JTVCJTdCJ3RyYW5zbGF0aW9uX3RleHQnJTNBJTIwJ1BhciUyMGQlQzMlQTlmYXV0JTIwcG91ciUyMGxlcyUyMHRocmVhZHMlMjAlQzMlQTlsYXJnaXMnJTdEJTVE",highlighted:'[{<span class="hljs-string">&#x27;translation_text&#x27;</span>: <span class="hljs-string">&#x27;Par défaut pour les threads élargis&#x27;</span>}]',wrap:!1}}),ie=new h({props:{code:"c3BsaXRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjE3MiU1RCU1QiUyMnRyYW5zbGF0aW9uJTIyJTVE",highlighted:'split_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">172</span>][<span class="hljs-string">&quot;translation&quot;</span>]',wrap:!1}}),Ue=new h({props:{code:"JTdCJ2VuJyUzQSUyMCdVbmFibGUlMjB0byUyMGltcG9ydCUyMCUyNTElMjB1c2luZyUyMHRoZSUyME9GWCUyMGltcG9ydGVyJTIwcGx1Z2luLiUyMFRoaXMlMjBmaWxlJTIwaXMlMjBub3QlMjB0aGUlMjBjb3JyZWN0JTIwZm9ybWF0LiclMkMlMEElMjAnZnInJTNBJTIwJTIySW1wb3NzaWJsZSUyMGQnaW1wb3J0ZXIlMjAlMjUxJTIwZW4lMjB1dGlsaXNhbnQlMjBsZSUyMG1vZHVsZSUyMGQnZXh0ZW5zaW9uJTIwZCdpbXBvcnRhdGlvbiUyME9GWC4lMjBDZSUyMGZpY2hpZXIlMjBuJ2ElMjBwYXMlMjB1biUyMGZvcm1hdCUyMGNvcnJlY3QuJTIyJTdE",highlighted:`{<span class="hljs-string">&#x27;en&#x27;</span>: <span class="hljs-string">&#x27;Unable to import %1 using the OFX importer plugin. This file is not the correct format.&#x27;</span>,
 <span class="hljs-string">&#x27;fr&#x27;</span>: <span class="hljs-string">&quot;Impossible d&#x27;importer %1 en utilisant le module d&#x27;extension d&#x27;importation OFX. Ce fichier n&#x27;a pas un format correct.&quot;</span>}`,wrap:!1}}),ye=new h({props:{code:"dHJhbnNsYXRvciglMEElMjAlMjAlMjAlMjAlMjJVbmFibGUlMjB0byUyMGltcG9ydCUyMCUyNTElMjB1c2luZyUyMHRoZSUyME9GWCUyMGltcG9ydGVyJTIwcGx1Z2luLiUyMFRoaXMlMjBmaWxlJTIwaXMlMjBub3QlMjB0aGUlMjBjb3JyZWN0JTIwZm9ybWF0LiUyMiUwQSk=",highlighted:`translator(
    <span class="hljs-string">&quot;Unable to import %1 using the OFX importer plugin. This file is not the correct format.&quot;</span>
)`,wrap:!1}}),me=new h({props:{code:"JTVCJTdCJ3RyYW5zbGF0aW9uX3RleHQnJTNBJTIwJTIySW1wb3NzaWJsZSUyMGQnaW1wb3J0ZXIlMjAlMjUxJTIwZW4lMjB1dGlsaXNhbnQlMjBsZSUyMHBsdWdpbiUyMGQnaW1wb3J0YXRldXIlMjBPRlguJTIwQ2UlMjBmaWNoaWVyJTIwbidlc3QlMjBwYXMlMjBsZSUyMGJvbiUyMGZvcm1hdC4lMjIlN0QlNUQ=",highlighted:'[{<span class="hljs-string">&#x27;translation_text&#x27;</span>: <span class="hljs-string">&quot;Impossible d&#x27;importer %1 en utilisant le plugin d&#x27;importateur OFX. Ce fichier n&#x27;est pas le bon format.&quot;</span>}]',wrap:!1}}),we=new kn({props:{id:"0Oxphw4Q9fo"}}),ql=new le({props:{$$slots:{default:[Pa]},$$scope:{ctx:k}}}),je=new Rl({props:{title:"Предварительная обработка данных",local:"processing-the-data",headingTag:"h3"}}),oe=new kn({props:{id:"XAR8jnZZuUs"}}),de=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIySGVsc2lua2ktTkxQJTJGb3B1cy1tdC1lbi1mciUyMiUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NoZWNrcG9pbnQlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnB0JTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

model_checkpoint = <span class="hljs-string">&quot;Helsinki-NLP/opus-mt-en-fr&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)`,wrap:!1}}),Ll=new le({props:{$$slots:{default:[Oa]},$$scope:{ctx:k}}}),Ce=new h({props:{code:"ZW5fc2VudGVuY2UlMjAlM0QlMjBzcGxpdF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMSU1RCU1QiUyMnRyYW5zbGF0aW9uJTIyJTVEJTVCJTIyZW4lMjIlNUQlMEFmcl9zZW50ZW5jZSUyMCUzRCUyMHNwbGl0X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIxJTVEJTVCJTIydHJhbnNsYXRpb24lMjIlNUQlNUIlMjJmciUyMiU1RCUwQSUwQWlucHV0cyUyMCUzRCUyMHRva2VuaXplcihlbl9zZW50ZW5jZSUyQyUyMHRleHRfdGFyZ2V0JTNEZnJfc2VudGVuY2UpJTBBaW5wdXRz",highlighted:`en_sentence = split_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">1</span>][<span class="hljs-string">&quot;translation&quot;</span>][<span class="hljs-string">&quot;en&quot;</span>]
fr_sentence = split_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">1</span>][<span class="hljs-string">&quot;translation&quot;</span>][<span class="hljs-string">&quot;fr&quot;</span>]

inputs = tokenizer(en_sentence, text_target=fr_sentence)
inputs`,wrap:!1}}),Ie=new h({props:{code:"JTdCJ2lucHV0X2lkcyclM0ElMjAlNUI0NzU5MSUyQyUyMDEyJTJDJTIwOTg0MiUyQyUyMDE5NjM0JTJDJTIwOSUyQyUyMDAlNUQlMkMlMjAnYXR0ZW50aW9uX21hc2snJTNBJTIwJTVCMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTVEJTJDJTIwJ2xhYmVscyclM0ElMjAlNUI1NzclMkMlMjA1ODkxJTJDJTIwMiUyQyUyMDMxODQlMkMlMjAxNiUyQyUyMDI1NDIlMkMlMjA1JTJDJTIwMTcxMCUyQyUyMDAlNUQlN0Q=",highlighted:'{<span class="hljs-string">&#x27;input_ids&#x27;</span>: [<span class="hljs-number">47591</span>, <span class="hljs-number">12</span>, <span class="hljs-number">9842</span>, <span class="hljs-number">19634</span>, <span class="hljs-number">9</span>, <span class="hljs-number">0</span>], <span class="hljs-string">&#x27;attention_mask&#x27;</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-string">&#x27;labels&#x27;</span>: [<span class="hljs-number">577</span>, <span class="hljs-number">5891</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3184</span>, <span class="hljs-number">16</span>, <span class="hljs-number">2542</span>, <span class="hljs-number">5</span>, <span class="hljs-number">1710</span>, <span class="hljs-number">0</span>]}',wrap:!1}}),$e=new h({props:{code:"d3JvbmdfdGFyZ2V0cyUyMCUzRCUyMHRva2VuaXplcihmcl9zZW50ZW5jZSklMEFwcmludCh0b2tlbml6ZXIuY29udmVydF9pZHNfdG9fdG9rZW5zKHdyb25nX3RhcmdldHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQpKSUwQXByaW50KHRva2VuaXplci5jb252ZXJ0X2lkc190b190b2tlbnMoaW5wdXRzJTVCJTIybGFiZWxzJTIyJTVEKSk=",highlighted:`wrong_targets = tokenizer(fr_sentence)
<span class="hljs-built_in">print</span>(tokenizer.convert_ids_to_tokens(wrong_targets[<span class="hljs-string">&quot;input_ids&quot;</span>]))
<span class="hljs-built_in">print</span>(tokenizer.convert_ids_to_tokens(inputs[<span class="hljs-string">&quot;labels&quot;</span>]))`,wrap:!1}}),ge=new h({props:{code:"JTVCJyVFMiU5NiU4MVBhciclMkMlMjAnJUUyJTk2JTgxZCVDMyVBOSclMkMlMjAnZiclMkMlMjAnYXV0JyUyQyUyMCclMkMnJTJDJTIwJyVFMiU5NiU4MWQlQzMlQTknJTJDJTIwJ3ZlJyUyQyUyMCdsb3AnJTJDJTIwJ3BlciclMkMlMjAnJUUyJTk2JTgxbGVzJyUyQyUyMCclRTIlOTYlODFmaWwnJTJDJTIwJ3MnJTJDJTIwJyVFMiU5NiU4MWRlJyUyQyUyMCclRTIlOTYlODFkaXNjdXNzaW9uJyUyQyUyMCclM0MlMkZzJTNFJyU1RCUwQSU1QiclRTIlOTYlODFQYXInJTJDJTIwJyVFMiU5NiU4MWQlQzMlQTlmYXV0JyUyQyUyMCclMkMnJTJDJTIwJyVFMiU5NiU4MWQlQzMlQTl2ZWxvcHBlciclMkMlMjAnJUUyJTk2JTgxbGVzJyUyQyUyMCclRTIlOTYlODFmaWxzJyUyQyUyMCclRTIlOTYlODFkZSclMkMlMjAnJUUyJTk2JTgxZGlzY3Vzc2lvbiclMkMlMjAnJTNDJTJGcyUzRSclNUQ=",highlighted:`[<span class="hljs-string">&#x27;▁Par&#x27;</span>, <span class="hljs-string">&#x27;▁dé&#x27;</span>, <span class="hljs-string">&#x27;f&#x27;</span>, <span class="hljs-string">&#x27;aut&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;▁dé&#x27;</span>, <span class="hljs-string">&#x27;ve&#x27;</span>, <span class="hljs-string">&#x27;lop&#x27;</span>, <span class="hljs-string">&#x27;per&#x27;</span>, <span class="hljs-string">&#x27;▁les&#x27;</span>, <span class="hljs-string">&#x27;▁fil&#x27;</span>, <span class="hljs-string">&#x27;s&#x27;</span>, <span class="hljs-string">&#x27;▁de&#x27;</span>, <span class="hljs-string">&#x27;▁discussion&#x27;</span>, <span class="hljs-string">&#x27;&lt;/s&gt;&#x27;</span>]
[<span class="hljs-string">&#x27;▁Par&#x27;</span>, <span class="hljs-string">&#x27;▁défaut&#x27;</span>, <span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;▁développer&#x27;</span>, <span class="hljs-string">&#x27;▁les&#x27;</span>, <span class="hljs-string">&#x27;▁fils&#x27;</span>, <span class="hljs-string">&#x27;▁de&#x27;</span>, <span class="hljs-string">&#x27;▁discussion&#x27;</span>, <span class="hljs-string">&#x27;&lt;/s&gt;&#x27;</span>]`,wrap:!1}}),xe=new h({props:{code:"bWF4X2xlbmd0aCUyMCUzRCUyMDEyOCUwQSUwQSUwQWRlZiUyMHByZXByb2Nlc3NfZnVuY3Rpb24oZXhhbXBsZXMpJTNBJTBBJTIwJTIwJTIwJTIwaW5wdXRzJTIwJTNEJTIwJTVCZXglNUIlMjJlbiUyMiU1RCUyMGZvciUyMGV4JTIwaW4lMjBleGFtcGxlcyU1QiUyMnRyYW5zbGF0aW9uJTIyJTVEJTVEJTBBJTIwJTIwJTIwJTIwdGFyZ2V0cyUyMCUzRCUyMCU1QmV4JTVCJTIyZnIlMjIlNUQlMjBmb3IlMjBleCUyMGluJTIwZXhhbXBsZXMlNUIlMjJ0cmFuc2xhdGlvbiUyMiU1RCU1RCUwQSUyMCUyMCUyMCUyMG1vZGVsX2lucHV0cyUyMCUzRCUyMHRva2VuaXplciglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpbnB1dHMlMkMlMjB0ZXh0X3RhcmdldCUzRHRhcmdldHMlMkMlMjBtYXhfbGVuZ3RoJTNEbWF4X2xlbmd0aCUyQyUyMHRydW5jYXRpb24lM0RUcnVlJTBBJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG1vZGVsX2lucHV0cw==",highlighted:`max_length = <span class="hljs-number">128</span>


<span class="hljs-keyword">def</span> <span class="hljs-title function_">preprocess_function</span>(<span class="hljs-params">examples</span>):
    inputs = [ex[<span class="hljs-string">&quot;en&quot;</span>] <span class="hljs-keyword">for</span> ex <span class="hljs-keyword">in</span> examples[<span class="hljs-string">&quot;translation&quot;</span>]]
    targets = [ex[<span class="hljs-string">&quot;fr&quot;</span>] <span class="hljs-keyword">for</span> ex <span class="hljs-keyword">in</span> examples[<span class="hljs-string">&quot;translation&quot;</span>]]
    model_inputs = tokenizer(
        inputs, text_target=targets, max_length=max_length, truncation=<span class="hljs-literal">True</span>
    )
    <span class="hljs-keyword">return</span> model_inputs`,wrap:!1}}),Pl=new le({props:{$$slots:{default:[Ka]},$$scope:{ctx:k}}}),Ol=new le({props:{warning:!0,$$slots:{default:[lM]},$$scope:{ctx:k}}}),Ve=new h({props:{code:"dG9rZW5pemVkX2RhdGFzZXRzJTIwJTNEJTIwc3BsaXRfZGF0YXNldHMubWFwKCUwQSUyMCUyMCUyMCUyMHByZXByb2Nlc3NfZnVuY3Rpb24lMkMlMEElMjAlMjAlMjAlMjBiYXRjaGVkJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMHJlbW92ZV9jb2x1bW5zJTNEc3BsaXRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RC5jb2x1bW5fbmFtZXMlMkMlMEEp",highlighted:`tokenized_datasets = split_datasets.<span class="hljs-built_in">map</span>(
    preprocess_function,
    batched=<span class="hljs-literal">True</span>,
    remove_columns=split_datasets[<span class="hljs-string">&quot;train&quot;</span>].column_names,
)`,wrap:!1}});const fa=[sM,eM],_s=[];function ba(l,t){return l[0]==="pt"?0:1}Al=ba(k),El=_s[Al]=fa[Al](k),Ge=new Rl({props:{title:"Сопоставление данных",local:"data-collation",headingTag:"h3"}});const ha=[aM,nM],Zs=[];function Ca(l,t){return l[0]==="pt"?0:1}Gl=Ca(k),Bl=Zs[Gl]=ha[Gl](k),We=new h({props:{code:"YmF0Y2glMjAlM0QlMjBkYXRhX2NvbGxhdG9yKCU1QnRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCaSU1RCUyMGZvciUyMGklMjBpbiUyMHJhbmdlKDElMkMlMjAzKSU1RCklMEFiYXRjaC5rZXlzKCk=",highlighted:`batch = 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">1</span>, <span class="hljs-number">3</span>)])
batch.keys()`,wrap:!1}}),ve=new h({props:{code:"ZGljdF9rZXlzKCU1QidhdHRlbnRpb25fbWFzayclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbHMnJTJDJTIwJ2RlY29kZXJfaW5wdXRfaWRzJyU1RCk=",highlighted:'dict_keys([<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;decoder_input_ids&#x27;</span>])',wrap:!1}}),He=new h({props:{code:"YmF0Y2glNUIlMjJsYWJlbHMlMjIlNUQ=",highlighted:'batch[<span class="hljs-string">&quot;labels&quot;</span>]',wrap:!1}}),Ye=new h({props:{code:"dGVuc29yKCU1QiU1QiUyMCUyMDU3NyUyQyUyMCUyMDU4OTElMkMlMjAlMjAlMjAlMjAlMjAyJTJDJTIwJTIwMzE4NCUyQyUyMCUyMCUyMCUyMDE2JTJDJTIwJTIwMjU0MiUyQyUyMCUyMCUyMCUyMCUyMDUlMkMlMjAlMjAxNzEwJTJDJTIwJTIwJTIwJTIwJTIwMCUyQyUyMCUyMC0xMDAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAtMTAwJTJDJTIwJTIwLTEwMCUyQyUyMCUyMC0xMDAlMkMlMjAlMjAtMTAwJTJDJTIwJTIwLTEwMCUyQyUyMCUyMC0xMDAlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUIlMjAxMjExJTJDJTIwJTIwJTIwJTIwJTIwMyUyQyUyMCUyMCUyMCUyMDQ5JTJDJTIwJTIwOTQwOSUyQyUyMCUyMDEyMTElMkMlMjAlMjAlMjAlMjAlMjAzJTJDJTIwMjkxNDAlMkMlMjAlMjAlMjA4MTclMkMlMjAlMjAzMTI0JTJDJTIwJTIwJTIwODE3JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNTUwJTJDJTIwJTIwNzAzMiUyQyUyMCUyMDU4MjElMkMlMjAlMjA3OTA3JTJDJTIwMTI2NDklMkMlMjAlMjAlMjAlMjAlMjAwJTVEJTVEKQ==",highlighted:`tensor([[  <span class="hljs-number">577</span>,  <span class="hljs-number">5891</span>,     <span class="hljs-number">2</span>,  <span class="hljs-number">3184</span>,    <span class="hljs-number">16</span>,  <span class="hljs-number">2542</span>,     <span class="hljs-number">5</span>,  <span class="hljs-number">1710</span>,     <span class="hljs-number">0</span>,  -<span class="hljs-number">100</span>,
          -<span class="hljs-number">100</span>,  -<span class="hljs-number">100</span>,  -<span class="hljs-number">100</span>,  -<span class="hljs-number">100</span>,  -<span class="hljs-number">100</span>,  -<span class="hljs-number">100</span>],
        [ <span class="hljs-number">1211</span>,     <span class="hljs-number">3</span>,    <span class="hljs-number">49</span>,  <span class="hljs-number">9409</span>,  <span class="hljs-number">1211</span>,     <span class="hljs-number">3</span>, <span class="hljs-number">29140</span>,   <span class="hljs-number">817</span>,  <span class="hljs-number">3124</span>,   <span class="hljs-number">817</span>,
           <span class="hljs-number">550</span>,  <span class="hljs-number">7032</span>,  <span class="hljs-number">5821</span>,  <span class="hljs-number">7907</span>, <span class="hljs-number">12649</span>,     <span class="hljs-number">0</span>]])`,wrap:!1}}),Fe=new h({props:{code:"YmF0Y2glNUIlMjJkZWNvZGVyX2lucHV0X2lkcyUyMiU1RA==",highlighted:'batch[<span class="hljs-string">&quot;decoder_input_ids&quot;</span>]',wrap:!1}}),Se=new h({props:{code:"dGVuc29yKCU1QiU1QjU5NTEzJTJDJTIwJTIwJTIwNTc3JTJDJTIwJTIwNTg5MSUyQyUyMCUyMCUyMCUyMCUyMDIlMkMlMjAlMjAzMTg0JTJDJTIwJTIwJTIwJTIwMTYlMkMlMjAlMjAyNTQyJTJDJTIwJTIwJTIwJTIwJTIwNSUyQyUyMCUyMDE3MTAlMkMlMjAlMjAlMjAlMjAlMjAwJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNTk1MTMlMkMlMjA1OTUxMyUyQyUyMDU5NTEzJTJDJTIwNTk1MTMlMkMlMjA1OTUxMyUyQyUyMDU5NTEzJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVCNTk1MTMlMkMlMjAlMjAxMjExJTJDJTIwJTIwJTIwJTIwJTIwMyUyQyUyMCUyMCUyMCUyMDQ5JTJDJTIwJTIwOTQwOSUyQyUyMCUyMDEyMTElMkMlMjAlMjAlMjAlMjAlMjAzJTJDJTIwMjkxNDAlMkMlMjAlMjAlMjA4MTclMkMlMjAlMjAzMTI0JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwODE3JTJDJTIwJTIwJTIwNTUwJTJDJTIwJTIwNzAzMiUyQyUyMCUyMDU4MjElMkMlMjAlMjA3OTA3JTJDJTIwMTI2NDklNUQlNUQp",highlighted:`tensor([[<span class="hljs-number">59513</span>,   <span class="hljs-number">577</span>,  <span class="hljs-number">5891</span>,     <span class="hljs-number">2</span>,  <span class="hljs-number">3184</span>,    <span class="hljs-number">16</span>,  <span class="hljs-number">2542</span>,     <span class="hljs-number">5</span>,  <span class="hljs-number">1710</span>,     <span class="hljs-number">0</span>,
         <span class="hljs-number">59513</span>, <span class="hljs-number">59513</span>, <span class="hljs-number">59513</span>, <span class="hljs-number">59513</span>, <span class="hljs-number">59513</span>, <span class="hljs-number">59513</span>],
        [<span class="hljs-number">59513</span>,  <span class="hljs-number">1211</span>,     <span class="hljs-number">3</span>,    <span class="hljs-number">49</span>,  <span class="hljs-number">9409</span>,  <span class="hljs-number">1211</span>,     <span class="hljs-number">3</span>, <span class="hljs-number">29140</span>,   <span class="hljs-number">817</span>,  <span class="hljs-number">3124</span>,
           <span class="hljs-number">817</span>,   <span class="hljs-number">550</span>,  <span class="hljs-number">7032</span>,  <span class="hljs-number">5821</span>,  <span class="hljs-number">7907</span>, <span class="hljs-number">12649</span>]])`,wrap:!1}}),Le=new h({props:{code:"Zm9yJTIwaSUyMGluJTIwcmFuZ2UoMSUyQyUyMDMpJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQodG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUJpJTVEJTVCJTIybGFiZWxzJTIyJTVEKQ==",highlighted:`<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>, <span class="hljs-number">3</span>):
    <span class="hljs-built_in">print</span>(tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][i][<span class="hljs-string">&quot;labels&quot;</span>])`,wrap:!1}}),Pe=new h({props:{code:"JTVCNTc3JTJDJTIwNTg5MSUyQyUyMDIlMkMlMjAzMTg0JTJDJTIwMTYlMkMlMjAyNTQyJTJDJTIwNSUyQyUyMDE3MTAlMkMlMjAwJTVEJTBBJTVCMTIxMSUyQyUyMDMlMkMlMjA0OSUyQyUyMDk0MDklMkMlMjAxMjExJTJDJTIwMyUyQyUyMDI5MTQwJTJDJTIwODE3JTJDJTIwMzEyNCUyQyUyMDgxNyUyQyUyMDU1MCUyQyUyMDcwMzIlMkMlMjA1ODIxJTJDJTIwNzkwNyUyQyUyMDEyNjQ5JTJDJTIwMCU1RA==",highlighted:`[<span class="hljs-number">577</span>, <span class="hljs-number">5891</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3184</span>, <span class="hljs-number">16</span>, <span class="hljs-number">2542</span>, <span class="hljs-number">5</span>, <span class="hljs-number">1710</span>, <span class="hljs-number">0</span>]
[<span class="hljs-number">1211</span>, <span class="hljs-number">3</span>, <span class="hljs-number">49</span>, <span class="hljs-number">9409</span>, <span class="hljs-number">1211</span>, <span class="hljs-number">3</span>, <span class="hljs-number">29140</span>, <span class="hljs-number">817</span>, <span class="hljs-number">3124</span>, <span class="hljs-number">817</span>, <span class="hljs-number">550</span>, <span class="hljs-number">7032</span>, <span class="hljs-number">5821</span>, <span class="hljs-number">7907</span>, <span class="hljs-number">12649</span>, <span class="hljs-number">0</span>]`,wrap:!1}});const Ia=[pM,MM],Vs=[];function Qa(l,t){return l[0]==="pt"?0:1}Nl=Qa(k),Xl=Vs[Nl]=Ia[Nl](k),Oe=new Rl({props:{title:"Метрики",local:"metrics",headingTag:"h3"}}),Ke=new kn({props:{id:"M05L1DhFqcw"}});let ul=k[0]==="pt"&&Ba();ss=new h({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzYWNyZWJsZXU=",highlighted:"!pip install sacrebleu",wrap:!1}}),ns=new h({props:{code:"aW1wb3J0JTIwZXZhbHVhdGUlMEElMEFtZXRyaWMlMjAlM0QlMjBldmFsdWF0ZS5sb2FkKCUyMnNhY3JlYmxldSUyMik=",highlighted:`<span class="hljs-keyword">import</span> evaluate

metric = evaluate.load(<span class="hljs-string">&quot;sacrebleu&quot;</span>)`,wrap:!1}}),ps=new h({props:{code:"cHJlZGljdGlvbnMlMjAlM0QlMjAlNUIlMEElMjAlMjAlMjAlMjAlMjJUaGlzJTIwcGx1Z2luJTIwbGV0cyUyMHlvdSUyMHRyYW5zbGF0ZSUyMHdlYiUyMHBhZ2VzJTIwYmV0d2VlbiUyMHNldmVyYWwlMjBsYW5ndWFnZXMlMjBhdXRvbWF0aWNhbGx5LiUyMiUwQSU1RCUwQXJlZmVyZW5jZXMlMjAlM0QlMjAlNUIlMEElMjAlMjAlMjAlMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJUaGlzJTIwcGx1Z2luJTIwYWxsb3dzJTIweW91JTIwdG8lMjBhdXRvbWF0aWNhbGx5JTIwdHJhbnNsYXRlJTIwd2ViJTIwcGFnZXMlMjBiZXR3ZWVuJTIwc2V2ZXJhbCUyMGxhbmd1YWdlcy4lMjIlMEElMjAlMjAlMjAlMjAlNUQlMEElNUQlMEFtZXRyaWMuY29tcHV0ZShwcmVkaWN0aW9ucyUzRHByZWRpY3Rpb25zJTJDJTIwcmVmZXJlbmNlcyUzRHJlZmVyZW5jZXMp",highlighted:`predictions = [
    <span class="hljs-string">&quot;This plugin lets you translate web pages between several languages automatically.&quot;</span>
]
references = [
    [
        <span class="hljs-string">&quot;This plugin allows you to automatically translate web pages between several languages.&quot;</span>
    ]
]
metric.compute(predictions=predictions, references=references)`,wrap:!1}}),Js=new h({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDQ2Ljc1MDQ2OTY4Mjk5MDE2NSUyQyUwQSUyMCdjb3VudHMnJTNBJTIwJTVCMTElMkMlMjA2JTJDJTIwNCUyQyUyMDMlNUQlMkMlMEElMjAndG90YWxzJyUzQSUyMCU1QjEyJTJDJTIwMTElMkMlMjAxMCUyQyUyMDklNUQlMkMlMEElMjAncHJlY2lzaW9ucyclM0ElMjAlNUI5MS42NyUyQyUyMDU0LjU0JTJDJTIwNDAuMCUyQyUyMDMzLjMzJTVEJTJDJTBBJTIwJ2JwJyUzQSUyMDAuOTIwMDQ0NDE0NjI5MzIzMyUyQyUwQSUyMCdzeXNfbGVuJyUzQSUyMDEyJTJDJTBBJTIwJ3JlZl9sZW4nJTNBJTIwMTMlN0Q=",highlighted:`{<span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">46.750469682990165</span>,
 <span class="hljs-string">&#x27;counts&#x27;</span>: [<span class="hljs-number">11</span>, <span class="hljs-number">6</span>, <span class="hljs-number">4</span>, <span class="hljs-number">3</span>],
 <span class="hljs-string">&#x27;totals&#x27;</span>: [<span class="hljs-number">12</span>, <span class="hljs-number">11</span>, <span class="hljs-number">10</span>, <span class="hljs-number">9</span>],
 <span class="hljs-string">&#x27;precisions&#x27;</span>: [<span class="hljs-number">91.67</span>, <span class="hljs-number">54.54</span>, <span class="hljs-number">40.0</span>, <span class="hljs-number">33.33</span>],
 <span class="hljs-string">&#x27;bp&#x27;</span>: <span class="hljs-number">0.9200444146293233</span>,
 <span class="hljs-string">&#x27;sys_len&#x27;</span>: <span class="hljs-number">12</span>,
 <span class="hljs-string">&#x27;ref_len&#x27;</span>: <span class="hljs-number">13</span>}`,wrap:!1}}),is=new h({props:{code:"cHJlZGljdGlvbnMlMjAlM0QlMjAlNUIlMjJUaGlzJTIwVGhpcyUyMFRoaXMlMjBUaGlzJTIyJTVEJTBBcmVmZXJlbmNlcyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMlRoaXMlMjBwbHVnaW4lMjBhbGxvd3MlMjB5b3UlMjB0byUyMGF1dG9tYXRpY2FsbHklMjB0cmFuc2xhdGUlMjB3ZWIlMjBwYWdlcyUyMGJldHdlZW4lMjBzZXZlcmFsJTIwbGFuZ3VhZ2VzLiUyMiUwQSUyMCUyMCUyMCUyMCU1RCUwQSU1RCUwQW1ldHJpYy5jb21wdXRlKHByZWRpY3Rpb25zJTNEcHJlZGljdGlvbnMlMkMlMjByZWZlcmVuY2VzJTNEcmVmZXJlbmNlcyk=",highlighted:`predictions = [<span class="hljs-string">&quot;This This This This&quot;</span>]
references = [
    [
        <span class="hljs-string">&quot;This plugin allows you to automatically translate web pages between several languages.&quot;</span>
    ]
]
metric.compute(predictions=predictions, references=references)`,wrap:!1}}),Us=new h({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDEuNjgzNjAyNjkzMTY3Njg5JTJDJTBBJTIwJ2NvdW50cyclM0ElMjAlNUIxJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTVEJTJDJTBBJTIwJ3RvdGFscyclM0ElMjAlNUI0JTJDJTIwMyUyQyUyMDIlMkMlMjAxJTVEJTJDJTBBJTIwJ3ByZWNpc2lvbnMnJTNBJTIwJTVCMjUuMCUyQyUyMDE2LjY3JTJDJTIwMTIuNSUyQyUyMDEyLjUlNUQlMkMlMEElMjAnYnAnJTNBJTIwMC4xMDUzOTkyMjQ1NjE4NjQzMyUyQyUwQSUyMCdzeXNfbGVuJyUzQSUyMDQlMkMlMEElMjAncmVmX2xlbiclM0ElMjAxMyU3RA==",highlighted:`{<span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">1.683602693167689</span>,
 <span class="hljs-string">&#x27;counts&#x27;</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>],
 <span class="hljs-string">&#x27;totals&#x27;</span>: [<span class="hljs-number">4</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>],
 <span class="hljs-string">&#x27;precisions&#x27;</span>: [<span class="hljs-number">25.0</span>, <span class="hljs-number">16.67</span>, <span class="hljs-number">12.5</span>, <span class="hljs-number">12.5</span>],
 <span class="hljs-string">&#x27;bp&#x27;</span>: <span class="hljs-number">0.10539922456186433</span>,
 <span class="hljs-string">&#x27;sys_len&#x27;</span>: <span class="hljs-number">4</span>,
 <span class="hljs-string">&#x27;ref_len&#x27;</span>: <span class="hljs-number">13</span>}`,wrap:!1}}),cs=new h({props:{code:"cHJlZGljdGlvbnMlMjAlM0QlMjAlNUIlMjJUaGlzJTIwcGx1Z2luJTIyJTVEJTBBcmVmZXJlbmNlcyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMlRoaXMlMjBwbHVnaW4lMjBhbGxvd3MlMjB5b3UlMjB0byUyMGF1dG9tYXRpY2FsbHklMjB0cmFuc2xhdGUlMjB3ZWIlMjBwYWdlcyUyMGJldHdlZW4lMjBzZXZlcmFsJTIwbGFuZ3VhZ2VzLiUyMiUwQSUyMCUyMCUyMCUyMCU1RCUwQSU1RCUwQW1ldHJpYy5jb21wdXRlKHByZWRpY3Rpb25zJTNEcHJlZGljdGlvbnMlMkMlMjByZWZlcmVuY2VzJTNEcmVmZXJlbmNlcyk=",highlighted:`predictions = [<span class="hljs-string">&quot;This plugin&quot;</span>]
references = [
    [
        <span class="hljs-string">&quot;This plugin allows you to automatically translate web pages between several languages.&quot;</span>
    ]
]
metric.compute(predictions=predictions, references=references)`,wrap:!1}}),ys=new h({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDAuMCUyQyUwQSUyMCdjb3VudHMnJTNBJTIwJTVCMiUyQyUyMDElMkMlMjAwJTJDJTIwMCU1RCUyQyUwQSUyMCd0b3RhbHMnJTNBJTIwJTVCMiUyQyUyMDElMkMlMjAwJTJDJTIwMCU1RCUyQyUwQSUyMCdwcmVjaXNpb25zJyUzQSUyMCU1QjEwMC4wJTJDJTIwMTAwLjAlMkMlMjAwLjAlMkMlMjAwLjAlNUQlMkMlMEElMjAnYnAnJTNBJTIwMC4wMDQwODY3NzE0Mzg0NjQwNjclMkMlMEElMjAnc3lzX2xlbiclM0ElMjAyJTJDJTBBJTIwJ3JlZl9sZW4nJTNBJTIwMTMlN0Q=",highlighted:`{<span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.0</span>,
 <span class="hljs-string">&#x27;counts&#x27;</span>: [<span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>],
 <span class="hljs-string">&#x27;totals&#x27;</span>: [<span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>],
 <span class="hljs-string">&#x27;precisions&#x27;</span>: [<span class="hljs-number">100.0</span>, <span class="hljs-number">100.0</span>, <span class="hljs-number">0.0</span>, <span class="hljs-number">0.0</span>],
 <span class="hljs-string">&#x27;bp&#x27;</span>: <span class="hljs-number">0.004086771438464067</span>,
 <span class="hljs-string">&#x27;sys_len&#x27;</span>: <span class="hljs-number">2</span>,
 <span class="hljs-string">&#x27;ref_len&#x27;</span>: <span class="hljs-number">13</span>}`,wrap:!1}});const $a=[rM,JM],As=[];function ga(l,t){return l[0]==="tf"?0:1}Wl=ga(k),vl=As[Wl]=$a[Wl](k),ws=new Rl({props:{title:"Дообучение модели",local:"fine-tuning-the-model",headingTag:"h3"}}),os=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),fs=new h({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}});const ka=[UM,iM],Es=[];function Ra(l,t){return l[0]==="tf"?0:1}Dl=Ra(k),Hl=Es[Dl]=ka[Dl](k);let Ml=k[0]==="pt"&&Na();return bs=new Rl({props:{title:"Использование дообученной модели",local:"using-the-fine-tuned-model",headingTag:"h2"}}),Cs=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBJTIzJTIwJUQwJTk3JUQwJUIwJUQwJUJDJUQwJUI1JUQwJUJEJUQwJUI4JUQxJTgyJUQwJUI1JTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQwJUJEJUQwJUIwJTIwJUQxJTgxJUQwJUIyJUQwJUJFJUQxJThFJTIwJUQxJTgxJUQwJUJFJUQwJUIxJUQxJTgxJUQxJTgyJUQwJUIyJUQwJUI1JUQwJUJEJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTgyJUQxJTgwJUQwJUJFJUQwJUJCJUQxJThDJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQxJTgyJUQwJUJFJUQxJTg3JUQwJUJBJUQxJTgzJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRm1hcmlhbi1maW5ldHVuZWQta2RlNC1lbi10by1mciUyMiUwQXRyYW5zbGF0b3IlMjAlM0QlMjBwaXBlbGluZSglMjJ0cmFuc2xhdGlvbiUyMiUyQyUyMG1vZGVsJTNEbW9kZWxfY2hlY2twb2ludCklMEF0cmFuc2xhdG9yKCUyMkRlZmF1bHQlMjB0byUyMGV4cGFuZGVkJTIwdGhyZWFkcyUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

<span class="hljs-comment"># Замените это на свою собственную контрольную точку</span>
model_checkpoint = <span class="hljs-string">&quot;huggingface-course/marian-finetuned-kde4-en-to-fr&quot;</span>
translator = pipeline(<span class="hljs-string">&quot;translation&quot;</span>, model=model_checkpoint)
translator(<span class="hljs-string">&quot;Default to expanded threads&quot;</span>)`,wrap:!1}}),Is=new h({props:{code:"JTVCJTdCJ3RyYW5zbGF0aW9uX3RleHQnJTNBJTIwJ1BhciUyMGQlQzMlQTlmYXV0JTJDJTIwZCVDMyVBOXZlbG9wcGVyJTIwbGVzJTIwZmlscyUyMGRlJTIwZGlzY3Vzc2lvbiclN0QlNUQ=",highlighted:'[{<span class="hljs-string">&#x27;translation_text&#x27;</span>: <span class="hljs-string">&#x27;Par défaut, développer les fils de discussion&#x27;</span>}]',wrap:!1}}),$s=new h({props:{code:"dHJhbnNsYXRvciglMEElMjAlMjAlMjAlMjAlMjJVbmFibGUlMjB0byUyMGltcG9ydCUyMCUyNTElMjB1c2luZyUyMHRoZSUyME9GWCUyMGltcG9ydGVyJTIwcGx1Z2luLiUyMFRoaXMlMjBmaWxlJTIwaXMlMjBub3QlMjB0aGUlMjBjb3JyZWN0JTIwZm9ybWF0LiUyMiUwQSk=",highlighted:`translator(
    <span class="hljs-string">&quot;Unable to import %1 using the OFX importer plugin. This file is not the correct format.&quot;</span>
)`,wrap:!1}}),gs=new h({props:{code:"JTVCJTdCJ3RyYW5zbGF0aW9uX3RleHQnJTNBJTIwJTIySW1wb3NzaWJsZSUyMGQnaW1wb3J0ZXIlMjAlMjUxJTIwZW4lMjB1dGlsaXNhbnQlMjBsZSUyMG1vZHVsZSUyMGV4dGVybmUlMjBkJ2ltcG9ydGF0aW9uJTIwT0ZYLiUyMENlJTIwZmljaGllciUyMG4nZXN0JTIwcGFzJTIwbGUlMjBib24lMjBmb3JtYXQuJTIyJTdEJTVE",highlighted:'[{<span class="hljs-string">&#x27;translation_text&#x27;</span>: <span class="hljs-string">&quot;Impossible d&#x27;importer %1 en utilisant le module externe d&#x27;importation OFX. Ce fichier n&#x27;est pas le bon format.&quot;</span>}]',wrap:!1}}),Kl=new le({props:{$$slots:{default:[mM]},$$scope:{ctx:k}}}),Rs=new Sa({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter7/4.mdx"}}),{c(){M=c("meta"),b=n(),J=c("p"),f=n(),m(g.$$.fragment),u=n(),m(R.$$.fragment),x=n(),$.c(),C=n(),V=c("p"),V.innerHTML=K,ml=n(),X=c("ul"),X.innerHTML=H,L=n(),m(B.$$.fragment),Tl=n(),W=c("p"),W.innerHTML=Y,P=n(),N=c("p"),N.innerHTML=$l,O=n(),E=c("p"),E.textContent=ll,v=n(),A=c("iframe"),el=n(),G=c("a"),G.innerHTML=d,Z=n(),sl=c("p"),sl.innerHTML=wl,Ul=n(),m(Jl.$$.fragment),dl=n(),z=c("p"),z.innerHTML=Fl,fl=n(),m(F.$$.fragment),bl=n(),S=c("p"),S.innerHTML=Yl,cl=n(),m(rl.$$.fragment),hl=n(),q=c("p"),q.innerHTML=Sl,Cl=n(),D=c("img"),tl=n(),gl=c("p"),gl.textContent=_l,nl=n(),m(jl.$$.fragment),yl=n(),m(il.$$.fragment),Zl=n(),al=c("p"),al.innerHTML=kl,Il=n(),m(r.$$.fragment),Q=n(),m(ol.$$.fragment),ee=n(),Vl=c("p"),Vl.innerHTML=p,I=n(),m(se.$$.fragment),Fs=n(),te=c("p"),te.textContent=Gn,Ss=n(),m(ne.$$.fragment),qs=n(),m(ae.$$.fragment),Ls=n(),Me=c("p"),Me.textContent=Bn,Ps=n(),m(pe.$$.fragment),Os=n(),m(Je.$$.fragment),Ks=n(),re=c("p"),re.textContent=Nn,lt=n(),m(ie.$$.fragment),et=n(),m(Ue.$$.fragment),st=n(),ce=c("p"),ce.textContent=Xn,tt=n(),m(ye.$$.fragment),nt=n(),m(me.$$.fragment),at=n(),Te=c("p"),Te.textContent=Wn,Mt=n(),m(we.$$.fragment),pt=n(),m(ql.$$.fragment),Jt=n(),m(je.$$.fragment),rt=n(),m(oe.$$.fragment),it=n(),ue=c("p"),ue.innerHTML=vn,Ut=n(),m(de.$$.fragment),ct=n(),fe=c("p"),fe.innerHTML=Dn,yt=n(),m(Ll.$$.fragment),mt=n(),be=c("p"),be.innerHTML=Hn,Tt=n(),he=c("p"),he.textContent=Yn,wt=n(),m(Ce.$$.fragment),jt=n(),m(Ie.$$.fragment),ot=n(),Qe=c("p"),Qe.innerHTML=zn,ut=n(),m($e.$$.fragment),dt=n(),m(ge.$$.fragment),ft=n(),ke=c("p"),ke.textContent=Fn,bt=n(),Re=c("p"),Re.innerHTML=Sn,ht=n(),m(xe.$$.fragment),Ct=n(),_e=c("p"),_e.textContent=qn,It=n(),m(Pl.$$.fragment),Qt=n(),m(Ol.$$.fragment),$t=n(),Ze=c("p"),Ze.textContent=Ln,gt=n(),m(Ve.$$.fragment),kt=n(),Ae=c("p"),Ae.textContent=Pn,Rt=n(),El.c(),Ns=n(),Ee=c("p"),Ee.textContent=On,xt=n(),m(Ge.$$.fragment),_t=n(),Be=c("p"),Be.innerHTML=Kn,Zt=n(),Ne=c("p"),Ne.innerHTML=la,Vt=n(),Bl.c(),Xs=n(),Xe=c("p"),Xe.textContent=ea,At=n(),m(We.$$.fragment),Et=n(),m(ve.$$.fragment),Gt=n(),De=c("p"),De.innerHTML=sa,Bt=n(),m(He.$$.fragment),Nt=n(),m(Ye.$$.fragment),Xt=n(),ze=c("p"),ze.textContent=ta,Wt=n(),m(Fe.$$.fragment),vt=n(),m(Se.$$.fragment),Dt=n(),qe=c("p"),qe.textContent=na,Ht=n(),m(Le.$$.fragment),Yt=n(),m(Pe.$$.fragment),zt=n(),Xl.c(),Ws=n(),m(Oe.$$.fragment),Ft=n(),m(Ke.$$.fragment),St=n(),ul&&ul.c(),vs=n(),ls=c("p"),ls.innerHTML=aa,qt=n(),es=c("p"),es.innerHTML=Ma,Lt=n(),m(ss.$$.fragment),Pt=n(),ts=c("p"),ts.innerHTML=pa,Ot=n(),m(ns.$$.fragment),Kt=n(),as=c("p"),as.textContent=Ja,ln=n(),Ms=c("p"),Ms.textContent=ra,en=n(),m(ps.$$.fragment),sn=n(),m(Js.$$.fragment),tn=n(),rs=c("p"),rs.innerHTML=ia,nn=n(),m(is.$$.fragment),an=n(),m(Us.$$.fragment),Mn=n(),m(cs.$$.fragment),pn=n(),m(ys.$$.fragment),Jn=n(),ms=c("p"),ms.textContent=Ua,rn=n(),vl.c(),Ds=n(),Ts=c("p"),Ts.textContent=ca,Un=n(),m(ws.$$.fragment),cn=n(),js=c("p"),js.textContent=ya,yn=n(),m(os.$$.fragment),mn=n(),us=c("p"),us.textContent=ma,Tn=n(),ds=c("p"),ds.textContent=Ta,wn=n(),m(fs.$$.fragment),jn=n(),Hl.c(),Hs=n(),Ml&&Ml.c(),Ys=n(),m(bs.$$.fragment),on=n(),hs=c("p"),hs.innerHTML=wa,un=n(),m(Cs.$$.fragment),dn=n(),m(Is.$$.fragment),fn=n(),Qs=c("p"),Qs.textContent=ja,bn=n(),m($s.$$.fragment),hn=n(),m(gs.$$.fragment),Cn=n(),ks=c("p"),ks.textContent=oa,In=n(),m(Kl.$$.fragment),Qn=n(),m(Rs.$$.fragment),$n=n(),zs=c("p"),this.h()},l(l){const t=Ya("svelte-u9bgzb",document.head);M=y(t,"META",{name:!0,content:!0}),t.forEach(e),b=a(l),J=y(l,"P",{}),En(J).forEach(e),f=a(l),T(g.$$.fragment,l),u=a(l),T(R.$$.fragment,l),x=a(l),$.l(l),C=a(l),V=y(l,"P",{"data-svelte-h":!0}),o(V)!=="svelte-lymfm5"&&(V.innerHTML=K),ml=a(l),X=y(l,"UL",{"data-svelte-h":!0}),o(X)!=="svelte-xhe24b"&&(X.innerHTML=H),L=a(l),T(B.$$.fragment,l),Tl=a(l),W=y(l,"P",{"data-svelte-h":!0}),o(W)!=="svelte-1qwp7l2"&&(W.innerHTML=Y),P=a(l),N=y(l,"P",{"data-svelte-h":!0}),o(N)!=="svelte-osz6mu"&&(N.innerHTML=$l),O=a(l),E=y(l,"P",{"data-svelte-h":!0}),o(E)!=="svelte-stu4v1"&&(E.textContent=ll),v=a(l),A=y(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),En(A).forEach(e),el=a(l),G=y(l,"A",{class:!0,href:!0,"data-svelte-h":!0}),o(G)!=="svelte-1ifl6xg"&&(G.innerHTML=d),Z=a(l),sl=y(l,"P",{"data-svelte-h":!0}),o(sl)!=="svelte-179pnyn"&&(sl.innerHTML=wl),Ul=a(l),T(Jl.$$.fragment,l),dl=a(l),z=y(l,"P",{"data-svelte-h":!0}),o(z)!=="svelte-uogjvh"&&(z.innerHTML=Fl),fl=a(l),T(F.$$.fragment,l),bl=a(l),S=y(l,"P",{"data-svelte-h":!0}),o(S)!=="svelte-1um7jf6"&&(S.innerHTML=Yl),cl=a(l),T(rl.$$.fragment,l),hl=a(l),q=y(l,"P",{"data-svelte-h":!0}),o(q)!=="svelte-wlom8l"&&(q.innerHTML=Sl),Cl=a(l),D=y(l,"IMG",{src:!0,alt:!0,width:!0}),tl=a(l),gl=y(l,"P",{"data-svelte-h":!0}),o(gl)!=="svelte-1o0lggf"&&(gl.textContent=_l),nl=a(l),T(jl.$$.fragment,l),yl=a(l),T(il.$$.fragment,l),Zl=a(l),al=y(l,"P",{"data-svelte-h":!0}),o(al)!=="svelte-gibflo"&&(al.innerHTML=kl),Il=a(l),T(r.$$.fragment,l),Q=a(l),T(ol.$$.fragment,l),ee=a(l),Vl=y(l,"P",{"data-svelte-h":!0}),o(Vl)!=="svelte-1btcc8n"&&(Vl.innerHTML=p),I=a(l),T(se.$$.fragment,l),Fs=a(l),te=y(l,"P",{"data-svelte-h":!0}),o(te)!=="svelte-1s87d8b"&&(te.textContent=Gn),Ss=a(l),T(ne.$$.fragment,l),qs=a(l),T(ae.$$.fragment,l),Ls=a(l),Me=y(l,"P",{"data-svelte-h":!0}),o(Me)!=="svelte-b5c1qg"&&(Me.textContent=Bn),Ps=a(l),T(pe.$$.fragment,l),Os=a(l),T(Je.$$.fragment,l),Ks=a(l),re=y(l,"P",{"data-svelte-h":!0}),o(re)!=="svelte-b2nq2r"&&(re.textContent=Nn),lt=a(l),T(ie.$$.fragment,l),et=a(l),T(Ue.$$.fragment,l),st=a(l),ce=y(l,"P",{"data-svelte-h":!0}),o(ce)!=="svelte-efpyv9"&&(ce.textContent=Xn),tt=a(l),T(ye.$$.fragment,l),nt=a(l),T(me.$$.fragment,l),at=a(l),Te=y(l,"P",{"data-svelte-h":!0}),o(Te)!=="svelte-1kh04uf"&&(Te.textContent=Wn),Mt=a(l),T(we.$$.fragment,l),pt=a(l),T(ql.$$.fragment,l),Jt=a(l),T(je.$$.fragment,l),rt=a(l),T(oe.$$.fragment,l),it=a(l),ue=y(l,"P",{"data-svelte-h":!0}),o(ue)!=="svelte-xvjbn2"&&(ue.innerHTML=vn),Ut=a(l),T(de.$$.fragment,l),ct=a(l),fe=y(l,"P",{"data-svelte-h":!0}),o(fe)!=="svelte-1mck5ju"&&(fe.innerHTML=Dn),yt=a(l),T(Ll.$$.fragment,l),mt=a(l),be=y(l,"P",{"data-svelte-h":!0}),o(be)!=="svelte-1dve248"&&(be.innerHTML=Hn),Tt=a(l),he=y(l,"P",{"data-svelte-h":!0}),o(he)!=="svelte-1bnpfp2"&&(he.textContent=Yn),wt=a(l),T(Ce.$$.fragment,l),jt=a(l),T(Ie.$$.fragment,l),ot=a(l),Qe=y(l,"P",{"data-svelte-h":!0}),o(Qe)!=="svelte-rnp1dw"&&(Qe.innerHTML=zn),ut=a(l),T($e.$$.fragment,l),dt=a(l),T(ge.$$.fragment,l),ft=a(l),ke=y(l,"P",{"data-svelte-h":!0}),o(ke)!=="svelte-e8sazi"&&(ke.textContent=Fn),bt=a(l),Re=y(l,"P",{"data-svelte-h":!0}),o(Re)!=="svelte-1agq64w"&&(Re.innerHTML=Sn),ht=a(l),T(xe.$$.fragment,l),Ct=a(l),_e=y(l,"P",{"data-svelte-h":!0}),o(_e)!=="svelte-1sdo1i8"&&(_e.textContent=qn),It=a(l),T(Pl.$$.fragment,l),Qt=a(l),T(Ol.$$.fragment,l),$t=a(l),Ze=y(l,"P",{"data-svelte-h":!0}),o(Ze)!=="svelte-66nwy7"&&(Ze.textContent=Ln),gt=a(l),T(Ve.$$.fragment,l),kt=a(l),Ae=y(l,"P",{"data-svelte-h":!0}),o(Ae)!=="svelte-xpiu8u"&&(Ae.textContent=Pn),Rt=a(l),El.l(l),Ns=a(l),Ee=y(l,"P",{"data-svelte-h":!0}),o(Ee)!=="svelte-10gyqk0"&&(Ee.textContent=On),xt=a(l),T(Ge.$$.fragment,l),_t=a(l),Be=y(l,"P",{"data-svelte-h":!0}),o(Be)!=="svelte-19dnlmn"&&(Be.innerHTML=Kn),Zt=a(l),Ne=y(l,"P",{"data-svelte-h":!0}),o(Ne)!=="svelte-7c2a7j"&&(Ne.innerHTML=la),Vt=a(l),Bl.l(l),Xs=a(l),Xe=y(l,"P",{"data-svelte-h":!0}),o(Xe)!=="svelte-mqcspz"&&(Xe.textContent=ea),At=a(l),T(We.$$.fragment,l),Et=a(l),T(ve.$$.fragment,l),Gt=a(l),De=y(l,"P",{"data-svelte-h":!0}),o(De)!=="svelte-yo3egr"&&(De.innerHTML=sa),Bt=a(l),T(He.$$.fragment,l),Nt=a(l),T(Ye.$$.fragment,l),Xt=a(l),ze=y(l,"P",{"data-svelte-h":!0}),o(ze)!=="svelte-1igthaw"&&(ze.textContent=ta),Wt=a(l),T(Fe.$$.fragment,l),vt=a(l),T(Se.$$.fragment,l),Dt=a(l),qe=y(l,"P",{"data-svelte-h":!0}),o(qe)!=="svelte-3pjm1z"&&(qe.textContent=na),Ht=a(l),T(Le.$$.fragment,l),Yt=a(l),T(Pe.$$.fragment,l),zt=a(l),Xl.l(l),Ws=a(l),T(Oe.$$.fragment,l),Ft=a(l),T(Ke.$$.fragment,l),St=a(l),ul&&ul.l(l),vs=a(l),ls=y(l,"P",{"data-svelte-h":!0}),o(ls)!=="svelte-1enicec"&&(ls.innerHTML=aa),qt=a(l),es=y(l,"P",{"data-svelte-h":!0}),o(es)!=="svelte-ti7c59"&&(es.innerHTML=Ma),Lt=a(l),T(ss.$$.fragment,l),Pt=a(l),ts=y(l,"P",{"data-svelte-h":!0}),o(ts)!=="svelte-vf7gqx"&&(ts.innerHTML=pa),Ot=a(l),T(ns.$$.fragment,l),Kt=a(l),as=y(l,"P",{"data-svelte-h":!0}),o(as)!=="svelte-nn2a1y"&&(as.textContent=Ja),ln=a(l),Ms=y(l,"P",{"data-svelte-h":!0}),o(Ms)!=="svelte-1577ypa"&&(Ms.textContent=ra),en=a(l),T(ps.$$.fragment,l),sn=a(l),T(Js.$$.fragment,l),tn=a(l),rs=y(l,"P",{"data-svelte-h":!0}),o(rs)!=="svelte-1n2zhyf"&&(rs.innerHTML=ia),nn=a(l),T(is.$$.fragment,l),an=a(l),T(Us.$$.fragment,l),Mn=a(l),T(cs.$$.fragment,l),pn=a(l),T(ys.$$.fragment,l),Jn=a(l),ms=y(l,"P",{"data-svelte-h":!0}),o(ms)!=="svelte-11c0r4b"&&(ms.textContent=Ua),rn=a(l),vl.l(l),Ds=a(l),Ts=y(l,"P",{"data-svelte-h":!0}),o(Ts)!=="svelte-p5cwue"&&(Ts.textContent=ca),Un=a(l),T(ws.$$.fragment,l),cn=a(l),js=y(l,"P",{"data-svelte-h":!0}),o(js)!=="svelte-1rje0g0"&&(js.textContent=ya),yn=a(l),T(os.$$.fragment,l),mn=a(l),us=y(l,"P",{"data-svelte-h":!0}),o(us)!=="svelte-22u5y6"&&(us.textContent=ma),Tn=a(l),ds=y(l,"P",{"data-svelte-h":!0}),o(ds)!=="svelte-4jtag1"&&(ds.textContent=Ta),wn=a(l),T(fs.$$.fragment,l),jn=a(l),Hl.l(l),Hs=a(l),Ml&&Ml.l(l),Ys=a(l),T(bs.$$.fragment,l),on=a(l),hs=y(l,"P",{"data-svelte-h":!0}),o(hs)!=="svelte-1eti9do"&&(hs.innerHTML=wa),un=a(l),T(Cs.$$.fragment,l),dn=a(l),T(Is.$$.fragment,l),fn=a(l),Qs=y(l,"P",{"data-svelte-h":!0}),o(Qs)!=="svelte-b8sd99"&&(Qs.textContent=ja),bn=a(l),T($s.$$.fragment,l),hn=a(l),T(gs.$$.fragment,l),Cn=a(l),ks=y(l,"P",{"data-svelte-h":!0}),o(ks)!=="svelte-oboug3"&&(ks.textContent=oa),In=a(l),T(Kl.$$.fragment,l),Qn=a(l),T(Rs.$$.fragment,l),$n=a(l),zs=y(l,"P",{}),En(zs).forEach(e),this.h()},h(){Ql(M,"name","hf:doc:metadata"),Ql(M,"content",wM),Ga(A.src,pl="https://course-demos-marian-finetuned-kde4-en-to-fr.hf.space")||Ql(A,"src",pl),Ql(A,"frameborder","0"),Ql(A,"height","350"),Ql(A,"title","Gradio app"),Ql(A,"class","block dark:hidden container p-0 flex-grow space-iframe"),Ql(A,"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"),Ql(A,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),Ql(G,"class","flex justify-center"),Ql(G,"href","/huggingface-course/marian-finetuned-kde4-en-to-fr"),Ga(D.src,xl="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/language_tags.png")||Ql(D,"src",xl),Ql(D,"alt","Language available for the KDE4 dataset."),Ql(D,"width","100%")},m(l,t){za(document.head,M),s(l,b,t),s(l,J,t),s(l,f,t),w(g,l,t),s(l,u,t),w(R,l,t),s(l,x,t),xs[_].m(l,t),s(l,C,t),s(l,V,t),s(l,ml,t),s(l,X,t),s(l,L,t),w(B,l,t),s(l,Tl,t),s(l,W,t),s(l,P,t),s(l,N,t),s(l,O,t),s(l,E,t),s(l,v,t),s(l,A,t),s(l,el,t),s(l,G,t),s(l,Z,t),s(l,sl,t),s(l,Ul,t),w(Jl,l,t),s(l,dl,t),s(l,z,t),s(l,fl,t),w(F,l,t),s(l,bl,t),s(l,S,t),s(l,cl,t),w(rl,l,t),s(l,hl,t),s(l,q,t),s(l,Cl,t),s(l,D,t),s(l,tl,t),s(l,gl,t),s(l,nl,t),w(jl,l,t),s(l,yl,t),w(il,l,t),s(l,Zl,t),s(l,al,t),s(l,Il,t),w(r,l,t),s(l,Q,t),w(ol,l,t),s(l,ee,t),s(l,Vl,t),s(l,I,t),w(se,l,t),s(l,Fs,t),s(l,te,t),s(l,Ss,t),w(ne,l,t),s(l,qs,t),w(ae,l,t),s(l,Ls,t),s(l,Me,t),s(l,Ps,t),w(pe,l,t),s(l,Os,t),w(Je,l,t),s(l,Ks,t),s(l,re,t),s(l,lt,t),w(ie,l,t),s(l,et,t),w(Ue,l,t),s(l,st,t),s(l,ce,t),s(l,tt,t),w(ye,l,t),s(l,nt,t),w(me,l,t),s(l,at,t),s(l,Te,t),s(l,Mt,t),w(we,l,t),s(l,pt,t),w(ql,l,t),s(l,Jt,t),w(je,l,t),s(l,rt,t),w(oe,l,t),s(l,it,t),s(l,ue,t),s(l,Ut,t),w(de,l,t),s(l,ct,t),s(l,fe,t),s(l,yt,t),w(Ll,l,t),s(l,mt,t),s(l,be,t),s(l,Tt,t),s(l,he,t),s(l,wt,t),w(Ce,l,t),s(l,jt,t),w(Ie,l,t),s(l,ot,t),s(l,Qe,t),s(l,ut,t),w($e,l,t),s(l,dt,t),w(ge,l,t),s(l,ft,t),s(l,ke,t),s(l,bt,t),s(l,Re,t),s(l,ht,t),w(xe,l,t),s(l,Ct,t),s(l,_e,t),s(l,It,t),w(Pl,l,t),s(l,Qt,t),w(Ol,l,t),s(l,$t,t),s(l,Ze,t),s(l,gt,t),w(Ve,l,t),s(l,kt,t),s(l,Ae,t),s(l,Rt,t),_s[Al].m(l,t),s(l,Ns,t),s(l,Ee,t),s(l,xt,t),w(Ge,l,t),s(l,_t,t),s(l,Be,t),s(l,Zt,t),s(l,Ne,t),s(l,Vt,t),Zs[Gl].m(l,t),s(l,Xs,t),s(l,Xe,t),s(l,At,t),w(We,l,t),s(l,Et,t),w(ve,l,t),s(l,Gt,t),s(l,De,t),s(l,Bt,t),w(He,l,t),s(l,Nt,t),w(Ye,l,t),s(l,Xt,t),s(l,ze,t),s(l,Wt,t),w(Fe,l,t),s(l,vt,t),w(Se,l,t),s(l,Dt,t),s(l,qe,t),s(l,Ht,t),w(Le,l,t),s(l,Yt,t),w(Pe,l,t),s(l,zt,t),Vs[Nl].m(l,t),s(l,Ws,t),w(Oe,l,t),s(l,Ft,t),w(Ke,l,t),s(l,St,t),ul&&ul.m(l,t),s(l,vs,t),s(l,ls,t),s(l,qt,t),s(l,es,t),s(l,Lt,t),w(ss,l,t),s(l,Pt,t),s(l,ts,t),s(l,Ot,t),w(ns,l,t),s(l,Kt,t),s(l,as,t),s(l,ln,t),s(l,Ms,t),s(l,en,t),w(ps,l,t),s(l,sn,t),w(Js,l,t),s(l,tn,t),s(l,rs,t),s(l,nn,t),w(is,l,t),s(l,an,t),w(Us,l,t),s(l,Mn,t),w(cs,l,t),s(l,pn,t),w(ys,l,t),s(l,Jn,t),s(l,ms,t),s(l,rn,t),As[Wl].m(l,t),s(l,Ds,t),s(l,Ts,t),s(l,Un,t),w(ws,l,t),s(l,cn,t),s(l,js,t),s(l,yn,t),w(os,l,t),s(l,mn,t),s(l,us,t),s(l,Tn,t),s(l,ds,t),s(l,wn,t),w(fs,l,t),s(l,jn,t),Es[Dl].m(l,t),s(l,Hs,t),Ml&&Ml.m(l,t),s(l,Ys,t),w(bs,l,t),s(l,on,t),s(l,hs,t),s(l,un,t),w(Cs,l,t),s(l,dn,t),w(Is,l,t),s(l,fn,t),s(l,Qs,t),s(l,bn,t),w($s,l,t),s(l,hn,t),w(gs,l,t),s(l,Cn,t),s(l,ks,t),s(l,In,t),w(Kl,l,t),s(l,Qn,t),w(Rs,l,t),s(l,$n,t),s(l,zs,t),gn=!0},p(l,[t]){const xa={};t&1&&(xa.fw=l[0]),g.$set(xa);let Rn=_;_=da(l),_!==Rn&&(Bs(),U(xs[Rn],1,1,()=>{xs[Rn]=null}),Gs(),$=xs[_],$||($=xs[_]=ua[_](l),$.c()),i($,1),$.m(C.parentNode,C));const _a={};t&2&&(_a.$$scope={dirty:t,ctx:l}),ql.$set(_a);const Za={};t&2&&(Za.$$scope={dirty:t,ctx:l}),Ll.$set(Za);const Va={};t&2&&(Va.$$scope={dirty:t,ctx:l}),Pl.$set(Va);const Aa={};t&2&&(Aa.$$scope={dirty:t,ctx:l}),Ol.$set(Aa);let xn=Al;Al=ba(l),Al!==xn&&(Bs(),U(_s[xn],1,1,()=>{_s[xn]=null}),Gs(),El=_s[Al],El||(El=_s[Al]=fa[Al](l),El.c()),i(El,1),El.m(Ns.parentNode,Ns));let _n=Gl;Gl=Ca(l),Gl!==_n&&(Bs(),U(Zs[_n],1,1,()=>{Zs[_n]=null}),Gs(),Bl=Zs[Gl],Bl||(Bl=Zs[Gl]=ha[Gl](l),Bl.c()),i(Bl,1),Bl.m(Xs.parentNode,Xs));let Zn=Nl;Nl=Qa(l),Nl!==Zn&&(Bs(),U(Vs[Zn],1,1,()=>{Vs[Zn]=null}),Gs(),Xl=Vs[Nl],Xl||(Xl=Vs[Nl]=Ia[Nl](l),Xl.c()),i(Xl,1),Xl.m(Ws.parentNode,Ws)),l[0]==="pt"?ul||(ul=Ba(),ul.c(),ul.m(vs.parentNode,vs)):ul&&(ul.d(1),ul=null);let Vn=Wl;Wl=ga(l),Wl!==Vn&&(Bs(),U(As[Vn],1,1,()=>{As[Vn]=null}),Gs(),vl=As[Wl],vl||(vl=As[Wl]=$a[Wl](l),vl.c()),i(vl,1),vl.m(Ds.parentNode,Ds));let An=Dl;Dl=Ra(l),Dl!==An&&(Bs(),U(Es[An],1,1,()=>{Es[An]=null}),Gs(),Hl=Es[Dl],Hl||(Hl=Es[Dl]=ka[Dl](l),Hl.c()),i(Hl,1),Hl.m(Hs.parentNode,Hs)),l[0]==="pt"?Ml?t&1&&i(Ml,1):(Ml=Na(),Ml.c(),i(Ml,1),Ml.m(Ys.parentNode,Ys)):Ml&&(Bs(),U(Ml,1,1,()=>{Ml=null}),Gs());const Ea={};t&2&&(Ea.$$scope={dirty:t,ctx:l}),Kl.$set(Ea)},i(l){gn||(i(g.$$.fragment,l),i(R.$$.fragment,l),i($),i(B.$$.fragment,l),i(Jl.$$.fragment,l),i(F.$$.fragment,l),i(rl.$$.fragment,l),i(jl.$$.fragment,l),i(il.$$.fragment,l),i(r.$$.fragment,l),i(ol.$$.fragment,l),i(se.$$.fragment,l),i(ne.$$.fragment,l),i(ae.$$.fragment,l),i(pe.$$.fragment,l),i(Je.$$.fragment,l),i(ie.$$.fragment,l),i(Ue.$$.fragment,l),i(ye.$$.fragment,l),i(me.$$.fragment,l),i(we.$$.fragment,l),i(ql.$$.fragment,l),i(je.$$.fragment,l),i(oe.$$.fragment,l),i(de.$$.fragment,l),i(Ll.$$.fragment,l),i(Ce.$$.fragment,l),i(Ie.$$.fragment,l),i($e.$$.fragment,l),i(ge.$$.fragment,l),i(xe.$$.fragment,l),i(Pl.$$.fragment,l),i(Ol.$$.fragment,l),i(Ve.$$.fragment,l),i(El),i(Ge.$$.fragment,l),i(Bl),i(We.$$.fragment,l),i(ve.$$.fragment,l),i(He.$$.fragment,l),i(Ye.$$.fragment,l),i(Fe.$$.fragment,l),i(Se.$$.fragment,l),i(Le.$$.fragment,l),i(Pe.$$.fragment,l),i(Xl),i(Oe.$$.fragment,l),i(Ke.$$.fragment,l),i(ss.$$.fragment,l),i(ns.$$.fragment,l),i(ps.$$.fragment,l),i(Js.$$.fragment,l),i(is.$$.fragment,l),i(Us.$$.fragment,l),i(cs.$$.fragment,l),i(ys.$$.fragment,l),i(vl),i(ws.$$.fragment,l),i(os.$$.fragment,l),i(fs.$$.fragment,l),i(Hl),i(Ml),i(bs.$$.fragment,l),i(Cs.$$.fragment,l),i(Is.$$.fragment,l),i($s.$$.fragment,l),i(gs.$$.fragment,l),i(Kl.$$.fragment,l),i(Rs.$$.fragment,l),gn=!0)},o(l){U(g.$$.fragment,l),U(R.$$.fragment,l),U($),U(B.$$.fragment,l),U(Jl.$$.fragment,l),U(F.$$.fragment,l),U(rl.$$.fragment,l),U(jl.$$.fragment,l),U(il.$$.fragment,l),U(r.$$.fragment,l),U(ol.$$.fragment,l),U(se.$$.fragment,l),U(ne.$$.fragment,l),U(ae.$$.fragment,l),U(pe.$$.fragment,l),U(Je.$$.fragment,l),U(ie.$$.fragment,l),U(Ue.$$.fragment,l),U(ye.$$.fragment,l),U(me.$$.fragment,l),U(we.$$.fragment,l),U(ql.$$.fragment,l),U(je.$$.fragment,l),U(oe.$$.fragment,l),U(de.$$.fragment,l),U(Ll.$$.fragment,l),U(Ce.$$.fragment,l),U(Ie.$$.fragment,l),U($e.$$.fragment,l),U(ge.$$.fragment,l),U(xe.$$.fragment,l),U(Pl.$$.fragment,l),U(Ol.$$.fragment,l),U(Ve.$$.fragment,l),U(El),U(Ge.$$.fragment,l),U(Bl),U(We.$$.fragment,l),U(ve.$$.fragment,l),U(He.$$.fragment,l),U(Ye.$$.fragment,l),U(Fe.$$.fragment,l),U(Se.$$.fragment,l),U(Le.$$.fragment,l),U(Pe.$$.fragment,l),U(Xl),U(Oe.$$.fragment,l),U(Ke.$$.fragment,l),U(ss.$$.fragment,l),U(ns.$$.fragment,l),U(ps.$$.fragment,l),U(Js.$$.fragment,l),U(is.$$.fragment,l),U(Us.$$.fragment,l),U(cs.$$.fragment,l),U(ys.$$.fragment,l),U(vl),U(ws.$$.fragment,l),U(os.$$.fragment,l),U(fs.$$.fragment,l),U(Hl),U(Ml),U(bs.$$.fragment,l),U(Cs.$$.fragment,l),U(Is.$$.fragment,l),U($s.$$.fragment,l),U(gs.$$.fragment,l),U(Kl.$$.fragment,l),U(Rs.$$.fragment,l),gn=!1},d(l){l&&(e(b),e(J),e(f),e(u),e(x),e(C),e(V),e(ml),e(X),e(L),e(Tl),e(W),e(P),e(N),e(O),e(E),e(v),e(A),e(el),e(G),e(Z),e(sl),e(Ul),e(dl),e(z),e(fl),e(bl),e(S),e(cl),e(hl),e(q),e(Cl),e(D),e(tl),e(gl),e(nl),e(yl),e(Zl),e(al),e(Il),e(Q),e(ee),e(Vl),e(I),e(Fs),e(te),e(Ss),e(qs),e(Ls),e(Me),e(Ps),e(Os),e(Ks),e(re),e(lt),e(et),e(st),e(ce),e(tt),e(nt),e(at),e(Te),e(Mt),e(pt),e(Jt),e(rt),e(it),e(ue),e(Ut),e(ct),e(fe),e(yt),e(mt),e(be),e(Tt),e(he),e(wt),e(jt),e(ot),e(Qe),e(ut),e(dt),e(ft),e(ke),e(bt),e(Re),e(ht),e(Ct),e(_e),e(It),e(Qt),e($t),e(Ze),e(gt),e(kt),e(Ae),e(Rt),e(Ns),e(Ee),e(xt),e(_t),e(Be),e(Zt),e(Ne),e(Vt),e(Xs),e(Xe),e(At),e(Et),e(Gt),e(De),e(Bt),e(Nt),e(Xt),e(ze),e(Wt),e(vt),e(Dt),e(qe),e(Ht),e(Yt),e(zt),e(Ws),e(Ft),e(St),e(vs),e(ls),e(qt),e(es),e(Lt),e(Pt),e(ts),e(Ot),e(Kt),e(as),e(ln),e(Ms),e(en),e(sn),e(tn),e(rs),e(nn),e(an),e(Mn),e(pn),e(Jn),e(ms),e(rn),e(Ds),e(Ts),e(Un),e(cn),e(js),e(yn),e(mn),e(us),e(Tn),e(ds),e(wn),e(jn),e(Hs),e(Ys),e(on),e(hs),e(un),e(dn),e(fn),e(Qs),e(bn),e(hn),e(Cn),e(ks),e(In),e(Qn),e($n),e(zs)),e(M),j(g,l),j(R,l),xs[_].d(l),j(B,l),j(Jl,l),j(F,l),j(rl,l),j(jl,l),j(il,l),j(r,l),j(ol,l),j(se,l),j(ne,l),j(ae,l),j(pe,l),j(Je,l),j(ie,l),j(Ue,l),j(ye,l),j(me,l),j(we,l),j(ql,l),j(je,l),j(oe,l),j(de,l),j(Ll,l),j(Ce,l),j(Ie,l),j($e,l),j(ge,l),j(xe,l),j(Pl,l),j(Ol,l),j(Ve,l),_s[Al].d(l),j(Ge,l),Zs[Gl].d(l),j(We,l),j(ve,l),j(He,l),j(Ye,l),j(Fe,l),j(Se,l),j(Le,l),j(Pe,l),Vs[Nl].d(l),j(Oe,l),j(Ke,l),ul&&ul.d(l),j(ss,l),j(ns,l),j(ps,l),j(Js,l),j(is,l),j(Us,l),j(cs,l),j(ys,l),As[Wl].d(l),j(ws,l),j(os,l),j(fs,l),Es[Dl].d(l),Ml&&Ml.d(l),j(bs,l),j(Cs,l),j(Is,l),j($s,l),j(gs,l),j(Kl,l),j(Rs,l)}}}const wM='{"title":"Перевод","local":"translation","sections":[{"title":"Подготовка данных","local":"preparing-the-data","sections":[{"title":"Датасет KDE4","local":"the-kde4-dataset","sections":[],"depth":3},{"title":"Предварительная обработка данных","local":"processing-the-data","sections":[],"depth":3}],"depth":2},{"title":"Дообучение модели с помощью API Trainer","local":"fine-tuning-the-model-with-the-trainer-api","sections":[],"depth":2},{"title":"Дообучение модели с Keras","local":"fine-tuning-the-model-with-keras","sections":[{"title":"Сопоставление данных","local":"data-collation","sections":[],"depth":3},{"title":"Метрики","local":"metrics","sections":[],"depth":3},{"title":"Дообучение модели","local":"fine-tuning-the-model","sections":[],"depth":3}],"depth":2},{"title":"Индивидуальный цикл обучения","local":"a-custom-training-loop","sections":[{"title":"Подготовка всего к обучению","local":"preparing-everything-for-training","sections":[],"depth":3},{"title":"Цикл обучения","local":"training-loop","sections":[],"depth":3}],"depth":2},{"title":"Использование дообученной модели","local":"using-the-fine-tuned-model","sections":[],"depth":2}],"depth":1}';function jM(k,M,b){let J="pt";return va(()=>{const f=new URLSearchParams(window.location.search);b(0,J=f.get("fw")||"pt")}),[J]}class QM extends Da{constructor(M){super(),Ha(this,M,jM,TM,Wa,{})}}export{QM as component};
