import{s as Ka,a as qa,o as Oa,n as qn}from"../chunks/scheduler.cc52f4b9.js";import{S as nc,i as lc,e as m,s,c as u,h as tc,a as y,d as l,b as a,f as Es,g as o,j as d,k as $n,l as ec,m as t,n as J,o as r,u as At,t as M,p as T,v as zt}from"../chunks/index.9480bb2b.js";import{T as ll}from"../chunks/Tip.f7b80743.js";import{C as sc,H as xn,E as ac}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.7aac1ff7.js";import{Y as Rs}from"../chunks/Youtube.7b12d9e8.js";import{C as w}from"../chunks/CodeBlock.ca838256.js";import{D as Pa}from"../chunks/DocNotebookDropdown.ab8dc26f.js";import{F as cc}from"../chunks/FrameworkSwitchCourse.42d12053.js";function hc(v){let c,j;return c=new Pa({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/vi/chapter7/section4_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/vi/chapter7/section4_tf.ipynb"}]}}),{c(){u(c.$$.fragment)},l(i){o(c.$$.fragment,i)},m(i,b){J(c,i,b),j=!0},i(i){j||(M(c.$$.fragment,i),j=!0)},o(i){r(c.$$.fragment,i),j=!1},d(i){T(c,i)}}}function ic(v){let c,j;return c=new Pa({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/vi/chapter7/section4_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/vi/chapter7/section4_pt.ipynb"}]}}),{c(){u(c.$$.fragment)},l(i){o(c.$$.fragment,i)},m(i,b){J(c,i,b),j=!0},i(i){j||(M(c.$$.fragment,i),j=!0)},o(i){r(c.$$.fragment,i),j=!1},d(i){T(c,i)}}}function pc(v){let c,j="✏️ <strong>Đến lượt bạn!</strong> Một từ tiếng Anh khác thường được sử dụng trong tiếng Pháp là “email”. Tìm mẫu đầu tiên trong tập dữ liệu huấn luyện sử dụng từ này. Nó được dịch như thế nào? Làm thế nào để mô hình huấn luyện trước dịch cùng một câu tiếng Anh?";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-7c22o9"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function Mc(v){let c,j="💡 Nếu bạn đang sử dụng trình tokenize đa ngôn ngữ như mBART, mBART-50 hoặc M2M100, bạn sẽ cần đặt mã ngôn ngữ của đầu vào và nhãn của mình trong trình tokenize bằng cách đặt <code>tokenizer.src_lang</code> và <code>tokenizer.tgt_lang</code> ở bên phải các giá trị.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-2kuyzh"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function rc(v){let c,j="💡 Nếu bạn đang sử dụng mô hình T5 (cụ thể hơn là một trong các checkpoint <code>t5-xxx</code>), mô hình sẽ mong đợi các đầu vào văn bản có tiền tố cho biết tác vụ đang thực hiện, chẳng hạn như <code>translate: English to French:</code>.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-mmotu2"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function mc(v){let c,j="⚠️ Chúng ta không chú ý đến attention mask của các nhãn, vì mô hình sẽ không mong đợi điều đó. Thay vào đó, các nhãn tương ứng với token đệm phải được đặt thành <code>-100</code> để chúng bị bỏ qua trong tính toán mất mát. Điều này sẽ được thực hiện bởi trình đối chiếu dữ liệu của chúng ta sau này vì chúng ta đang áp dụng đệm động, nhưng nếu bạn sử dụng đệm ở đây, bạn nên điều chỉnh chức năng tiền xử lý để đặt tất cả các nhãn tương ứng với token đệm thành <code>-100</code>.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-1eaqk2u"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function yc(v){let c,j,i,b="Điều đầu tiên, chúng ta cần một mô hình thực tế để tinh chỉnh. Chúng ta sẽ sử dụng API <code>AutoModel</code>:",I,g,Z,_,B;return c=new xn({props:{title:"Tinh chỉnh mô hình với Keras",local:"tinh-chỉnh-mô-hình-với-keras",headingTag:"h2"}}),g=new w({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}}),_=new ll({props:{warning:!1,$$slots:{default:[oc]},$$scope:{ctx:v}}}),{c(){u(c.$$.fragment),j=s(),i=m("p"),i.innerHTML=b,I=s(),u(g.$$.fragment),Z=s(),u(_.$$.fragment)},l($){o(c.$$.fragment,$),j=a($),i=y($,"P",{"data-svelte-h":!0}),d(i)!=="svelte-qd10rh"&&(i.innerHTML=b),I=a($),o(g.$$.fragment,$),Z=a($),o(_.$$.fragment,$)},m($,f){J(c,$,f),t($,j,f),t($,i,f),t($,I,f),J(g,$,f),t($,Z,f),J(_,$,f),B=!0},i($){B||(M(c.$$.fragment,$),M(g.$$.fragment,$),M(_.$$.fragment,$),B=!0)},o($){r(c.$$.fragment,$),r(g.$$.fragment,$),r(_.$$.fragment,$),B=!1},d($){$&&(l(j),l(i),l(I),l(Z)),T(c,$),T(g,$),T(_,$)}}}function uc(v){let c,j,i,b='Đoạn mã thực sử dụng <code>Trainer</code> sẽ giống như trước đây, chỉ với một thay đổi nhỏ: chúng ta sử dụng <a href="https://huggingface.co/transformers/main_classes/trainer.html#seq2seqtrainer" rel="nofollow"><code>Seq2SeqTrainer</code></a> tại đây, là một lớp con của <code>Trainer</code> sẽ cho phép chúng ta xử lý tốt việc đánh giá, sử dụng phương thức <code>generate()</code> để dự đoán kết quả đầu ra từ các đầu vào. Chúng ta sẽ đi sâu vào vấn đề đó chi tiết hơn khi ta nói về tính toán số liệu.',I,g,Z="Điều đầu tiên, chúng ta cần một mô hình thực tế để tinh chỉnh. Chúng ta sẽ sử dụng API <code>AutoModel</code>:",_,B,$;return c=new xn({props:{title:"Tinh chỉnh mô hình với API Trainer",local:"tinh-chỉnh-mô-hình-với-api-trainer",headingTag:"h2"}}),B=new w({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(){u(c.$$.fragment),j=s(),i=m("p"),i.innerHTML=b,I=s(),g=m("p"),g.innerHTML=Z,_=s(),u(B.$$.fragment)},l(f){o(c.$$.fragment,f),j=a(f),i=y(f,"P",{"data-svelte-h":!0}),d(i)!=="svelte-jp9kln"&&(i.innerHTML=b),I=a(f),g=y(f,"P",{"data-svelte-h":!0}),d(g)!=="svelte-qd10rh"&&(g.innerHTML=Z),_=a(f),o(B.$$.fragment,f)},m(f,G){J(c,f,G),t(f,j,G),t(f,i,G),t(f,I,G),t(f,g,G),t(f,_,G),J(B,f,G),$=!0},i(f){$||(M(c.$$.fragment,f),M(B.$$.fragment,f),$=!0)},o(f){r(c.$$.fragment,f),r(B.$$.fragment,f),$=!1},d(f){f&&(l(j),l(i),l(I),l(g),l(_)),T(c,f),T(B,f)}}}function oc(v){let c,j="💡 Checkpoint <code>Helsinki-NLP/opus-mt-en-fr</code> chỉ có trọng số PyTorch, nên bạn sẽ nhận được lỗi nếu bạn cố tải mô hình mà không sử dụng tham số <code>from_pt=True</code>, thư viện sẽ tự động tải và chuyển các trọng số Pytorch cho bạn. Như bạn có thể thấy, rất đơn giản để chuyển giữa các khung trong 🤗 Transformers!";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-11i0y9x"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function Jc(v){let c,j;return c=new w({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(){u(c.$$.fragment)},l(i){o(c.$$.fragment,i)},m(i,b){J(c,i,b),j=!0},i(i){j||(M(c.$$.fragment,i),j=!0)},o(i){r(c.$$.fragment,i),j=!1},d(i){T(c,i)}}}function Tc(v){let c,j;return c=new w({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(){u(c.$$.fragment)},l(i){o(c.$$.fragment,i)},m(i,b){J(c,i,b),j=!0},i(i){j||(M(c.$$.fragment,i),j=!0)},o(i){r(c.$$.fragment,i),j=!1},d(i){T(c,i)}}}function dc(v){let c,j="Ta có thể sử dụng <code>data_collator</code> để chuyển mỗi phần dữ liệu thành <code>tf.data.Dataset</code>, sẵn sàng để huấn luyện:",i,b,I;return b=new w({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmlucHV0X2lkcyUyMiUyQyUyMCUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIybGFiZWxzJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0QzMiUyQyUwQSklMEF0Zl9ldmFsX2RhdGFzZXQlMjAlM0QlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmlucHV0X2lkcyUyMiUyQyUyMCUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIybGFiZWxzJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjBiYXRjaF9zaXplJTNEMTYlMkMlMEEp",highlighted:`tf_train_dataset = tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">True</span>,
    batch_size=<span class="hljs-number">32</span>,
)
tf_eval_dataset = tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">16</span>,
)`,wrap:!1}}),{c(){c=m("p"),c.innerHTML=j,i=s(),u(b.$$.fragment)},l(g){c=y(g,"P",{"data-svelte-h":!0}),d(c)!=="svelte-8y0p3w"&&(c.innerHTML=j),i=a(g),o(b.$$.fragment,g)},m(g,Z){t(g,c,Z),t(g,i,Z),J(b,g,Z),I=!0},i(g){I||(M(b.$$.fragment,g),I=!0)},o(g){r(b.$$.fragment,g),I=!1},d(g){g&&(l(c),l(i)),T(b,g)}}}function gc(v){let c,j="Chúng ta sẽ truyền <code>data_collator</code> vào <code>Seq2SeqTrainer</code>. Tiếp theo, chúng ta hãy xem xét chỉ số.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-111s26n"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},i:qn,o:qn,d(i){i&&l(c)}}}function Da(v){let c,j="Tính năng mà <code>Seq2SeqTrainer</code> thêm vào lớp cha <code>Trainer</code> của nó là khả năng sử dụng phương thức <code>generate()</code> trong quá trình đánh giá hoặc dự đoán. Trong quá trình huấn luyện, mô hình sẽ sử dụng <code>decoder_input_ids</code> với attention mask đảm bảo nó không sử dụng các token sau token mà nó đang cố gắng dự đoán, để tăng tốc độ huấn luyện. Trong quá trình luận suy, chúng ta sẽ không thể sử dụng những thứ đó vì chúng ta sẽ không có nhãn, vì vậy, bạn nên đánh giá mô hình của mình với cùng một thiết lập.",i,b,I='Như chúng ta đã thấy trong <a href="/course/chapter1/6">Chương 1</a>, bộ giải mã thực hiện luận suy bằng cách dự đoán từng token - một thứ được triển khai phía sau trong 🤗 Transformers bằng phương thức <code>generate()</code>. <code>Seq2SeqTrainer</code> sẽ cho phép chúng ta sử dụng phương pháp đó để đánh giá nếu chúng ta đặt <code>predict_with_generate=True</code>.';return{c(){c=m("p"),c.innerHTML=j,i=s(),b=m("p"),b.innerHTML=I},l(g){c=y(g,"P",{"data-svelte-h":!0}),d(c)!=="svelte-m698me"&&(c.innerHTML=j),i=a(g),b=y(g,"P",{"data-svelte-h":!0}),d(b)!=="svelte-k2vbfa"&&(b.innerHTML=I)},m(g,Z){t(g,c,Z),t(g,i,Z),t(g,b,Z)},d(g){g&&(l(c),l(i),l(b))}}}function Uc(v){let c,j="To get from the model outputs to texts the metric can use, we will use the <code>tokenizer.batch_decode()</code> method. We just have to clean up all the <code>-100</code>s in the labels (the tokenizer will automatically do the same for the padding token):",i,b,I;return b=new w({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTBBZGVmJTIwY29tcHV0ZV9tZXRyaWNzKGV2YWxfcHJlZHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZHMlMkMlMjBsYWJlbHMlMjAlM0QlMjBldmFsX3ByZWRzJTBBJTIwJTIwJTIwJTIwJTIzJTIwVHJvbmclMjB0ciVDNiVCMCVFMSVCQiU5RG5nJTIwaCVFMSVCQiVBM3AlMjBtJUMzJUI0JTIwaCVDMyVBQ25oJTIwdHIlRTElQkElQTMlMjB2JUUxJUJCJTgxJTIwbmhpJUUxJUJCJTgxdSUyMGglQzYlQTFuJTIwbG9naXQlMjBkJUUxJUJCJUIxJTIwJUM0JTkxbyVDMyVBMW4lMEElMjAlMjAlMjAlMjBpZiUyMGlzaW5zdGFuY2UocHJlZHMlMkMlMjB0dXBsZSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmVkcyUyMCUzRCUyMHByZWRzJTVCMCU1RCUwQSUwQSUyMCUyMCUyMCUyMGRlY29kZWRfcHJlZHMlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKHByZWRzJTJDJTIwc2tpcF9zcGVjaWFsX3Rva2VucyUzRFRydWUpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwVGhheSUyMGMlQzMlQTFjJTIwZyVDMyVBRGElMjB0ciVFMSVCQiU4QiUyMC0xMDAlMjB0cm9uZyUyMG5oJUMzJUEzbiUyMHYlQzMlQUMlMjB0YSUyMGtoJUMzJUI0bmclMjBnaSVFMSVCQSVBM2klMjBtJUMzJUEzJTIwY2glQzMlQkFuZyUwQSUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMG5wLndoZXJlKGxhYmVscyUyMCElM0QlMjAtMTAwJTJDJTIwbGFiZWxzJTJDJTIwdG9rZW5pemVyLnBhZF90b2tlbl9pZCklMEElMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMHRva2VuaXplci5iYXRjaF9kZWNvZGUobGFiZWxzJTJDJTIwc2tpcF9zcGVjaWFsX3Rva2VucyUzRFRydWUpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwVGglRTElQkIlQjFjJTIwbSVFMSVCQiU5OXQlMjBtJUUxJUJCJTk5dCUyMHglRTElQkIlOTElMjBoJUUxJUJBJUFEdSUyMHglRTElQkIlQTclMjBsJUMzJUJEJTIwJUM0JTkxJUM2JUExbiUyMGdpJUUxJUJBJUEzbiUwQSUyMCUyMCUyMCUyMGRlY29kZWRfcHJlZHMlMjAlM0QlMjAlNUJwcmVkLnN0cmlwKCklMjBmb3IlMjBwcmVkJTIwaW4lMjBkZWNvZGVkX3ByZWRzJTVEJTBBJTIwJTIwJTIwJTIwZGVjb2RlZF9sYWJlbHMlMjAlM0QlMjAlNUIlNUJsYWJlbC5zdHJpcCgpJTVEJTIwZm9yJTIwbGFiZWwlMjBpbiUyMGRlY29kZWRfbGFiZWxzJTVEJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwbWV0cmljLmNvbXB1dGUocHJlZGljdGlvbnMlM0RkZWNvZGVkX3ByZWRzJTJDJTIwcmVmZXJlbmNlcyUzRGRlY29kZWRfbGFiZWxzKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCU3QiUyMmJsZXUlMjIlM0ElMjByZXN1bHQlNUIlMjJzY29yZSUyMiU1RCU3RA==",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"># Trong trường hợp mô hình trả về nhiều hơn logit dự đoán</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"># Thay các gía trị -100 trong nhãn vì ta không giải mã chúng</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"># Thực một một xố hậu xủ lý đơn giản</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(){c=m("p"),c.innerHTML=j,i=s(),u(b.$$.fragment)},l(g){c=y(g,"P",{"data-svelte-h":!0}),d(c)!=="svelte-12prd39"&&(c.innerHTML=j),i=a(g),o(b.$$.fragment,g)},m(g,Z){t(g,c,Z),t(g,i,Z),J(b,g,Z),I=!0},i(g){I||(M(b.$$.fragment,g),I=!0)},o(g){r(b.$$.fragment,g),I=!1},d(g){g&&(l(c),l(i)),T(b,g)}}}function bc(v){let c,j="Để chuyển từ kết quả đầu ra của mô hình thành văn bản mà chỉ số có thể sử dụng, chúng ta sẽ sử dụng phương thức <code>tokenizer.batch_decode()</code>. Chúng ta chỉ cần xóa tất cả các <code>-100</code> trong các nhãn; tokenizer sẽ tự động làm điều tương tự đối với token đệm. Hãy xác định một hàm sử dụng mô hình và tập dữ liệu của chúng ta và tính toán các số liệu trên đó. Vì việc tạo chuỗi dài có thể chậm, chúng ta lấy mẫu thay thế bộ kiểm định để đảm bảo điều này không chạy mãi mãi:",i,b,I;return b=new w({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTBBZGVmJTIwY29tcHV0ZV9tZXRyaWNzKCklM0ElMEElMjAlMjAlMjAlMjBhbGxfcHJlZHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBhbGxfbGFiZWxzJTIwJTNEJTIwJTVCJTVEJTBBJTIwJTIwJTIwJTIwc2FtcGxlZF9kYXRhc2V0JTIwJTNEJTIwdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydmFsaWRhdGlvbiUyMiU1RC5zaHVmZmxlKCkuc2VsZWN0KHJhbmdlKDIwMCkpJTBBJTIwJTIwJTIwJTIwdGZfZ2VuZXJhdGVfZGF0YXNldCUyMCUzRCUyMHNhbXBsZWRfZGF0YXNldC50b190Zl9kYXRhc2V0KCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbHVtbnMlM0QlNUIlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJhdHRlbnRpb25fbWFzayUyMiUyQyUyMCUyMmxhYmVscyUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2h1ZmZsZSUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDQlMkMlMEElMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMHRmX2dlbmVyYXRlX2RhdGFzZXQlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmVkaWN0aW9ucyUyMCUzRCUyMG1vZGVsLmdlbmVyYXRlKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0X2lkcyUzRGJhdGNoJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTJDJTIwYXR0ZW50aW9uX21hc2slM0RiYXRjaCU1QiUyMmF0dGVudGlvbl9tYXNrJTIyJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlY29kZWRfcHJlZHMlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKHByZWRpY3Rpb25zJTJDJTIwc2tpcF9zcGVjaWFsX3Rva2VucyUzRFRydWUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwYmF0Y2glNUIlMjJsYWJlbHMlMjIlNUQubnVtcHkoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMG5wLndoZXJlKGxhYmVscyUyMCElM0QlMjAtMTAwJTJDJTIwbGFiZWxzJTJDJTIwdG9rZW5pemVyLnBhZF90b2tlbl9pZCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMHRva2VuaXplci5iYXRjaF9kZWNvZGUobGFiZWxzJTJDJTIwc2tpcF9zcGVjaWFsX3Rva2VucyUzRFRydWUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVjb2RlZF9wcmVkcyUyMCUzRCUyMCU1QnByZWQuc3RyaXAoKSUyMGZvciUyMHByZWQlMjBpbiUyMGRlY29kZWRfcHJlZHMlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsLnN0cmlwKCklNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwZGVjb2RlZF9sYWJlbHMlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfcHJlZHMuZXh0ZW5kKGRlY29kZWRfcHJlZHMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWxsX2xhYmVscy5leHRlbmQoZGVjb2RlZF9sYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwbWV0cmljLmNvbXB1dGUocHJlZGljdGlvbnMlM0RhbGxfcHJlZHMlMkMlMjByZWZlcmVuY2VzJTNEYWxsX2xhYmVscyklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMjJibGV1JTIyJTNBJTIwcmVzdWx0JTVCJTIyc2NvcmUlMjIlNUQlN0Q=",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>():
    all_preds = []
    all_labels = []
    sampled_dataset = tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>].shuffle().select(<span class="hljs-built_in">range</span>(<span class="hljs-number">200</span>))
    tf_generate_dataset = sampled_dataset.to_tf_dataset(
        columns=[<span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>],
        collate_fn=data_collator,
        shuffle=<span class="hljs-literal">False</span>,
        batch_size=<span class="hljs-number">4</span>,
    )
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> tf_generate_dataset:
        predictions = 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>]
        )
        decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=<span class="hljs-literal">True</span>)
        labels = batch[<span class="hljs-string">&quot;labels&quot;</span>].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(){c=m("p"),c.innerHTML=j,i=s(),u(b.$$.fragment)},l(g){c=y(g,"P",{"data-svelte-h":!0}),d(c)!=="svelte-1xc789c"&&(c.innerHTML=j),i=a(g),o(b.$$.fragment,g)},m(g,Z){t(g,c,Z),t(g,i,Z),J(b,g,Z),I=!0},i(g){I||(M(b.$$.fragment,g),I=!0)},o(g){r(b.$$.fragment,g),I=!1},d(g){g&&(l(c),l(i)),T(b,g)}}}function jc(v){let c,j="Khi điều này được thực hiện, chúng ta có thể xác định <code>Seq2SeqTrainingArguments</code>. Giống như đối với <code>Trainer</code>, chúng ta sử dụng một lớp con của <code>TrainingArguments</code> chứa thêm một số trường:",i,b,I,g,Z="Ngoài các siêu tham số thông thường (như tốc độ học, số epoch, kích thước lô và một số phân rã trọng số), đây là một số thay đổi so với những gì chúng ta đã thấy trong các phần trước:",_,B,$="<li>Chúng ta không đặt bất kỳ đánh giá thường xuyên nào, vì quá trình đánh giá sẽ mất một khoảng thời gian; chúng ta sẽ chỉ đánh giá mô hình của mình một lần trước khi huấn luyện và sau đó.</li> <li>Chúng ta đặt <code>fp16=True</code>, giúp tăng tốc quá trình huấn luyện trên các GPU hiện đại.</li> <li>Chúng ta đặt <code>predict_with_generate=True</code>, như đã thảo luận ở trên.</li> <li>Chúng ta sử dụng <code>push_to_hub=True</code> để tải mô hình lên Hub vào cuối mỗi epoch.</li>",f,G,Q='Lưu ý rằng bạn có thể chỉ định tên đầy đủ của kho lưu trữ mà bạn muốn đẩy đến bằng tham số <code>hub_model_id</code> (đặc biệt, bạn sẽ phải sử dụng tham số này để đẩy đến một tổ chức). Ví dụ: khi chúng ta đẩy mô hình vào tổ chức <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, chúng ta đã thêm <code>hub_model_id=&quot;huggingface-course/marian-finetuned-kde4-en-to-fr&quot;</code> thành <code>Seq2SeqTrainingArguments</code>. Theo mặc định, kho lưu trữ được sử dụng sẽ nằm trong không gian tên của bạn và được đặt tên theo thư mục đầu ra mà bạn đã đặt, vì vậy trong trường hợp của chúng tôi, nó sẽ là <code>&quot;sgugger/marian-finetuned-kde4-en-to-fr&quot;</code> (là mô hình chúng tôi liên kết đến ở đầu phần này).',cn,O,N,W,P="Cuối cùng, ta chỉ cần truyền mọi thứ cho <code>Seq2SeqTrainer</code>:",Tn,X,A,z,K="Trước khi huấn luyện, trước tiên chúng ta sẽ xem xét điểm mà mô hình của chúng ta nhận được, để kiểm tra kỹ xem chúng ta có đang không làm mọi thứ tồi tệ hơn với việc tinh chỉnh của chúng ta hay không. Lệnh này sẽ mất một chút thời gian, vì vậy bạn có thể uống một ly cà phê trong khi nó thực thi:",dn,E,Y,L,R,hn,nn="Điểm BLEU là 39 không quá tệ, điều này phản ánh thực tế là mô hình của chúng ta đã rất giỏi trong việc dịch các câu tiếng Anh sang tiếng Pháp.",V,ln,U="Tiếp theo là huấn luyện, cũng sẽ mất một chút thời gian:",x,gn,mn,tn,vn="Lưu ý rằng trong khi quá trình huấn luyện diễn ra, mỗi khi mô hình được lưu (ở đây, mỗi epoch), nó sẽ được tải lên Hub ở chế độ nền. Bằng cách này, bạn sẽ có thể tiếp tục huấn luyện của mình trên một máy khác nếu cần.",wn,F,Yn="Sau khi huấn luyện xong, chúng ta đánh giá lại mô hình của mình - hy vọng chúng ta sẽ thấy một số cải thiện trong điểm BLEU!",yn,pn,fn,S,_n,en,Zn="Đó là một cải tiến hơn gần 14 điểm, thật tuyệt vời.",kn,q,Fn="Cuối cùng, chúng ta sử dụng phương thức <code>push_to_hub()</code> để đảm bảo tải lên phiên bản mới nhất của mô hình. <code>Trainer</code> cũng soạn thảo một thẻ mô hình với tất cả các kết quả đánh giá và tải nó lên. Thẻ mô hình này chứa siêu dữ liệu giúp Model Hub chọn tiện ích con cho bản trình diễn luận suy. Thông thường, không cần phải nói bất cứ điều gì vì nó có thể suy ra tiện ích con phù hợp từ lớp mô hình, nhưng trong trường hợp này, cùng một lớp mô hình có thể được sử dụng cho tất cả các loại vấn đề chuỗi sang chuỗi, vì vậy chúng ta chỉ định đó là một mô hình dịch:",un,Mn,Cn,H,Dn="Lệnh này trả về URL của cam kết mà nó vừa thực hiện, nếu bạn muốn kiểm tra nó:",In,D,Sn,on,rn="Ở giai đoạn này, bạn có thể sử dụng tiện ích luận suy trên Model Hub để kiểm tra mô hình của mình và chia sẻ với bạn bè. Bạn đã tinh chỉnh thành công một mô hình trong tác vụ dịch - xin chúc mừng!",Gn,sn,Un="Nếu bạn muốn tìm hiểu sâu hơn một chút về vòng lặp huấn luyện, bây giờ chúng tôi sẽ hướng dẫn bạn cách thực hiện điều tương tự bằng cách sử dụng 🤗 Accelerate.",Jn;return b=new w({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}}),O=new ll({props:{$$slots:{default:[fc]},$$scope:{ctx:v}}}),X=new w({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}}),E=new w({props:{code:"dHJhaW5lci5ldmFsdWF0ZShtYXhfbGVuZ3RoJTNEbWF4X3RhcmdldF9sZW5ndGgp",highlighted:"trainer.evaluate(max_length=max_target_length)",wrap:!1}}),L=new w({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}}),gn=new w({props:{code:"dHJhaW5lci50cmFpbigp",highlighted:"trainer.train()",wrap:!1}}),pn=new w({props:{code:"dHJhaW5lci5ldmFsdWF0ZShtYXhfbGVuZ3RoJTNEbWF4X3RhcmdldF9sZW5ndGgp",highlighted:"trainer.evaluate(max_length=max_target_length)",wrap:!1}}),S=new w({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}}),Mn=new w({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}}),D=new w({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(){c=m("p"),c.innerHTML=j,i=s(),u(b.$$.fragment),I=s(),g=m("p"),g.textContent=Z,_=s(),B=m("ul"),B.innerHTML=$,f=s(),G=m("p"),G.innerHTML=Q,cn=s(),u(O.$$.fragment),N=s(),W=m("p"),W.innerHTML=P,Tn=s(),u(X.$$.fragment),A=s(),z=m("p"),z.textContent=K,dn=s(),u(E.$$.fragment),Y=s(),u(L.$$.fragment),R=s(),hn=m("p"),hn.textContent=nn,V=s(),ln=m("p"),ln.textContent=U,x=s(),u(gn.$$.fragment),mn=s(),tn=m("p"),tn.textContent=vn,wn=s(),F=m("p"),F.textContent=Yn,yn=s(),u(pn.$$.fragment),fn=s(),u(S.$$.fragment),_n=s(),en=m("p"),en.textContent=Zn,kn=s(),q=m("p"),q.innerHTML=Fn,un=s(),u(Mn.$$.fragment),Cn=s(),H=m("p"),H.textContent=Dn,In=s(),u(D.$$.fragment),Sn=s(),on=m("p"),on.textContent=rn,Gn=s(),sn=m("p"),sn.textContent=Un},l(p){c=y(p,"P",{"data-svelte-h":!0}),d(c)!=="svelte-fhr20w"&&(c.innerHTML=j),i=a(p),o(b.$$.fragment,p),I=a(p),g=y(p,"P",{"data-svelte-h":!0}),d(g)!=="svelte-1t6vwsd"&&(g.textContent=Z),_=a(p),B=y(p,"UL",{"data-svelte-h":!0}),d(B)!=="svelte-17o829q"&&(B.innerHTML=$),f=a(p),G=y(p,"P",{"data-svelte-h":!0}),d(G)!=="svelte-jldzif"&&(G.innerHTML=Q),cn=a(p),o(O.$$.fragment,p),N=a(p),W=y(p,"P",{"data-svelte-h":!0}),d(W)!=="svelte-15jdgqx"&&(W.innerHTML=P),Tn=a(p),o(X.$$.fragment,p),A=a(p),z=y(p,"P",{"data-svelte-h":!0}),d(z)!=="svelte-e80l1j"&&(z.textContent=K),dn=a(p),o(E.$$.fragment,p),Y=a(p),o(L.$$.fragment,p),R=a(p),hn=y(p,"P",{"data-svelte-h":!0}),d(hn)!=="svelte-9tev16"&&(hn.textContent=nn),V=a(p),ln=y(p,"P",{"data-svelte-h":!0}),d(ln)!=="svelte-1n5v5hm"&&(ln.textContent=U),x=a(p),o(gn.$$.fragment,p),mn=a(p),tn=y(p,"P",{"data-svelte-h":!0}),d(tn)!=="svelte-1fxnk8l"&&(tn.textContent=vn),wn=a(p),F=y(p,"P",{"data-svelte-h":!0}),d(F)!=="svelte-1v67fq4"&&(F.textContent=Yn),yn=a(p),o(pn.$$.fragment,p),fn=a(p),o(S.$$.fragment,p),_n=a(p),en=y(p,"P",{"data-svelte-h":!0}),d(en)!=="svelte-s7wtfy"&&(en.textContent=Zn),kn=a(p),q=y(p,"P",{"data-svelte-h":!0}),d(q)!=="svelte-twmov4"&&(q.innerHTML=Fn),un=a(p),o(Mn.$$.fragment,p),Cn=a(p),H=y(p,"P",{"data-svelte-h":!0}),d(H)!=="svelte-1iip4y1"&&(H.textContent=Dn),In=a(p),o(D.$$.fragment,p),Sn=a(p),on=y(p,"P",{"data-svelte-h":!0}),d(on)!=="svelte-qbcc6p"&&(on.textContent=rn),Gn=a(p),sn=y(p,"P",{"data-svelte-h":!0}),d(sn)!=="svelte-1ebqyle"&&(sn.textContent=Un)},m(p,C){t(p,c,C),t(p,i,C),J(b,p,C),t(p,I,C),t(p,g,C),t(p,_,C),t(p,B,C),t(p,f,C),t(p,G,C),t(p,cn,C),J(O,p,C),t(p,N,C),t(p,W,C),t(p,Tn,C),J(X,p,C),t(p,A,C),t(p,z,C),t(p,dn,C),J(E,p,C),t(p,Y,C),J(L,p,C),t(p,R,C),t(p,hn,C),t(p,V,C),t(p,ln,C),t(p,x,C),J(gn,p,C),t(p,mn,C),t(p,tn,C),t(p,wn,C),t(p,F,C),t(p,yn,C),J(pn,p,C),t(p,fn,C),J(S,p,C),t(p,_n,C),t(p,en,C),t(p,kn,C),t(p,q,C),t(p,un,C),J(Mn,p,C),t(p,Cn,C),t(p,H,C),t(p,In,C),J(D,p,C),t(p,Sn,C),t(p,on,C),t(p,Gn,C),t(p,sn,C),Jn=!0},i(p){Jn||(M(b.$$.fragment,p),M(O.$$.fragment,p),M(X.$$.fragment,p),M(E.$$.fragment,p),M(L.$$.fragment,p),M(gn.$$.fragment,p),M(pn.$$.fragment,p),M(S.$$.fragment,p),M(Mn.$$.fragment,p),M(D.$$.fragment,p),Jn=!0)},o(p){r(b.$$.fragment,p),r(O.$$.fragment,p),r(X.$$.fragment,p),r(E.$$.fragment,p),r(L.$$.fragment,p),r(gn.$$.fragment,p),r(pn.$$.fragment,p),r(S.$$.fragment,p),r(Mn.$$.fragment,p),r(D.$$.fragment,p),Jn=!1},d(p){p&&(l(c),l(i),l(I),l(g),l(_),l(B),l(f),l(G),l(cn),l(N),l(W),l(Tn),l(A),l(z),l(dn),l(Y),l(R),l(hn),l(V),l(ln),l(x),l(mn),l(tn),l(wn),l(F),l(yn),l(fn),l(_n),l(en),l(kn),l(q),l(un),l(Cn),l(H),l(In),l(Sn),l(on),l(Gn),l(sn)),T(b,p),T(O,p),T(X,p),T(E,p),T(L,p),T(gn,p),T(pn,p),T(S,p),T(Mn,p),T(D,p)}}}function wc(v){let c,j="Trước khi bắt đầu, hãy xem loại kết quả nào chúng tôi nhận được từ mô hình của mình mà không cần huấn luyện:",i,b,I,g,Z,_,B="Khi điều này được thực hiện, chúng ta có thể chuẩn bị mọi thứ cần để biên dịch và huấn luyện mô hình của mình. Lưu ý việc sử dụng <code>tf.keras.mixed_precision.set_global_policy(&quot;mixed_float16&quot;)</code> - điều này sẽ yêu cầu Keras huấn luyện bằng cách sử dụng float16, điều có thể giúp tăng tốc đáng kể trên các GPU hỗ trợ nó (Nvidia 20xx/V100 hoặc mới hơn).",$,f,G,Q,cn='Tiếp theo, chúng ta xác định một <code>PushToHubCallback</code> để tải mô hình lên Hub trong quá trình huấn luyện, như chúng ta đã thấy trong <a href="(/course/chapter7/2)">phần 2</a>, và sau đó chúng ta chỉ cần điều chỉnh mô hình với lệnh gọi lại đó:',O,N,W,P,Tn='Lưu ý rằng bạn có thể chỉ định tên của kho lưu trữ mà bạn muốn đẩy lên bằng tham số <code>hub_model_id</code> (cụ thể là bạn sẽ phải sử dụng tham số này để đẩy lên một tổ chức). Ví dụ: khi chúng tôi đẩy mô hình vào tổ chức <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, chúng ta đã thêm <code>hub_model_id=&quot;huggingface-course/marian-finetuned-kde4-en-to-fr&quot;</code> thành <code>Seq2SeqTrainingArguments</code>. Theo mặc định, kho lưu trữ được sử dụng sẽ nằm trong không gian tên của bạn và được đặt tên theo thư mục đầu ra mà bạn đã đặt, vì vậy ở đây nó sẽ là <code>&quot;sgugger/marian-finetuned-kde4-en-to-fr&quot;</code> (là mô hình mà chúng tôi đã liên kết với ở đầu phần này).',X,A,z,K,dn="Cuối cùng, hãy xem các chỉ số của chúng ta trông như thế nào khi quá trình huấn luyện đã kết thúc:",E,Y,L,R,hn,nn,V="Ở giai đoạn này, bạn có thể sử dụng tiện ích luận suy trên Model Hub để kiểm tra mô hình của mình và chia sẻ với bạn bè. Bạn đã tinh chỉnh thành công một mô hình trong tác vụ dịch - xin chúc mừng!",ln;return b=new w({props:{code:"cHJpbnQoY29tcHV0ZV9tZXRyaWNzKCkp",highlighted:'<span class="hljs-built_in">print</span>(compute_metrics())',wrap:!1}}),g=new w({props:{code:"JTdCJ2JsZXUnJTNBJTIwMzMuMjY5ODM3MDE0NTQ3MzMlN0Q=",highlighted:'{&#x27;bleu&#x27;: <span class="hljs-number">33.26983701454733</span>}',wrap:!1}}),f=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFmcm9tJTIwdHJhbnNmb3JtZXJzLmtlcmFzX2NhbGxiYWNrcyUyMGltcG9ydCUyMFB1c2hUb0h1YkNhbGxiYWNrJTBBaW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEElMjMlMjBTJUUxJUJCJTkxJTIwYiVDNiVCMCVFMSVCQiU5QmMlMjBodSVFMSVCQSVBNW4lMjBsdXklRTElQkIlODduJTIwbCVDMyVBMCUyMHMlRTElQkIlOTElMjBsJUM2JUIwJUUxJUJCJUEzbmclMjBtJUUxJUJBJUFCdSUyMHRyb25nJTIwdCVFMSVCQSVBRHAlMjBkJUUxJUJCJUFGJTIwbGklRTElQkIlODd1JTJDJTIwY2hpYSUyMGNobyUyMGslQzMlQURjaCUyMHRoJUM2JUIwJUUxJUJCJTlCYyUyMGwlQzMlQjQlMjBzYXUlMjAlQzQlOTElQzMlQjMlMjBuaCVDMyVBMm4lMEElMjMlMjB2JUUxJUJCJTlCaSUyMHQlRTElQkIlOTVuZyUyMHMlRTElQkIlOTElMjBlcG9jaC4lMjBMJUM2JUIwdSUyMCVDMyVCRCUyMHIlRTElQkElQjFuZyUyMHRmX3RyYWluX2RhdGFzZXQlMjAlRTElQkIlOUYlMjAlQzQlOTElQzMlQTJ5JTIwbCVDMyVBMCUyMHRmLmRhdGEuRGF0YXNldCUyMHRoZW8lMjBsJUMzJUI0JTJDJTBBJTIzJTIwa2glQzMlQjRuZyUyMHBoJUUxJUJBJUEzaSUyMGwlQzMlQTAlMjBIdWdnaW5nJTIwRmFjZSUyMERhdGFzZXQlMjBiYW4lMjAlQzQlOTElRTElQkElQTd1JTJDJTIwdiVDMyVBQyUyMHYlRTElQkElQUR5JTIwbGVuKCklMjBjJUUxJUJCJUE3YSUyMG4lQzMlQjMlMjB2JUUxJUJCJTkxbiUyMGwlQzMlQTAlMjBudW1fc2FtcGxlcyUyMCUyRiUyRiUyMGJhdGNoX3NpemUuJTBBJTBBbnVtX2Vwb2NocyUyMCUzRCUyMDMlMEFudW1fdHJhaW5fc3RlcHMlMjAlM0QlMjBsZW4odGZfdHJhaW5fZGF0YXNldCklMjAqJTIwbnVtX2Vwb2NocyUwQSUwQW9wdGltaXplciUyQyUyMHNjaGVkdWxlJTIwJTNEJTIwY3JlYXRlX29wdGltaXplciglMEElMjAlMjAlMjAlMjBpbml0X2xyJTNENWUtNSUyQyUwQSUyMCUyMCUyMCUyMG51bV93YXJtdXBfc3RlcHMlM0QwJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3RyYWluX3N0ZXBzJTNEbnVtX3RyYWluX3N0ZXBzJTJDJTBBJTIwJTIwJTIwJTIwd2VpZ2h0X2RlY2F5X3JhdGUlM0QwLjAxJTJDJTBBKSUwQW1vZGVsLmNvbXBpbGUob3B0aW1pemVyJTNEb3B0aW1pemVyKSUwQSUwQSUyMyUyMEh1JUUxJUJBJUE1biUyMGx1eSVFMSVCQiU4N24lMjB0cm9uZyUyMG1peGVkLXByZWNpc2lvbiUyMGZsb2F0MTYlMEF0Zi5rZXJhcy5taXhlZF9wcmVjaXNpb24uc2V0X2dsb2JhbF9wb2xpY3koJTIybWl4ZWRfZmxvYXQxNiUyMik=",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"># Số bước huấn luyện là số lượng mẫu trong tập dữ liệu, chia cho kích thước lô sau đó nhân</span>
<span class="hljs-comment"># với tổng số epoch. Lưu ý rằng tf_train_dataset ở đây là tf.data.Dataset theo lô,</span>
<span class="hljs-comment"># không phải là Hugging Face Dataset ban đầu, vì vậy len() của nó vốn là 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"># Huấn luyện trong mixed-precision float16</span>
tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">&quot;mixed_float16&quot;</span>)`,wrap:!1}}),N=new w({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}}),A=new ll({props:{$$slots:{default:[kc]},$$scope:{ctx:v}}}),Y=new w({props:{code:"cHJpbnQoY29tcHV0ZV9tZXRyaWNzKCkp",highlighted:'<span class="hljs-built_in">print</span>(compute_metrics())',wrap:!1}}),R=new w({props:{code:"JTdCJ2JsZXUnJTNBJTIwNTcuMzM0MDY2MjcxNTQ1ODY1JTdE",highlighted:'{&#x27;bleu&#x27;: <span class="hljs-number">57.334066271545865</span>}',wrap:!1}}),{c(){c=m("p"),c.textContent=j,i=s(),u(b.$$.fragment),I=s(),u(g.$$.fragment),Z=s(),_=m("p"),_.innerHTML=B,$=s(),u(f.$$.fragment),G=s(),Q=m("p"),Q.innerHTML=cn,O=s(),u(N.$$.fragment),W=s(),P=m("p"),P.innerHTML=Tn,X=s(),u(A.$$.fragment),z=s(),K=m("p"),K.textContent=dn,E=s(),u(Y.$$.fragment),L=s(),u(R.$$.fragment),hn=s(),nn=m("p"),nn.textContent=V},l(U){c=y(U,"P",{"data-svelte-h":!0}),d(c)!=="svelte-e2hmu0"&&(c.textContent=j),i=a(U),o(b.$$.fragment,U),I=a(U),o(g.$$.fragment,U),Z=a(U),_=y(U,"P",{"data-svelte-h":!0}),d(_)!=="svelte-1o2tkbb"&&(_.innerHTML=B),$=a(U),o(f.$$.fragment,U),G=a(U),Q=y(U,"P",{"data-svelte-h":!0}),d(Q)!=="svelte-1a912om"&&(Q.innerHTML=cn),O=a(U),o(N.$$.fragment,U),W=a(U),P=y(U,"P",{"data-svelte-h":!0}),d(P)!=="svelte-2328v7"&&(P.innerHTML=Tn),X=a(U),o(A.$$.fragment,U),z=a(U),K=y(U,"P",{"data-svelte-h":!0}),d(K)!=="svelte-e3jqn0"&&(K.textContent=dn),E=a(U),o(Y.$$.fragment,U),L=a(U),o(R.$$.fragment,U),hn=a(U),nn=y(U,"P",{"data-svelte-h":!0}),d(nn)!=="svelte-qbcc6p"&&(nn.textContent=V)},m(U,x){t(U,c,x),t(U,i,x),J(b,U,x),t(U,I,x),J(g,U,x),t(U,Z,x),t(U,_,x),t(U,$,x),J(f,U,x),t(U,G,x),t(U,Q,x),t(U,O,x),J(N,U,x),t(U,W,x),t(U,P,x),t(U,X,x),J(A,U,x),t(U,z,x),t(U,K,x),t(U,E,x),J(Y,U,x),t(U,L,x),J(R,U,x),t(U,hn,x),t(U,nn,x),ln=!0},i(U){ln||(M(b.$$.fragment,U),M(g.$$.fragment,U),M(f.$$.fragment,U),M(N.$$.fragment,U),M(A.$$.fragment,U),M(Y.$$.fragment,U),M(R.$$.fragment,U),ln=!0)},o(U){r(b.$$.fragment,U),r(g.$$.fragment,U),r(f.$$.fragment,U),r(N.$$.fragment,U),r(A.$$.fragment,U),r(Y.$$.fragment,U),r(R.$$.fragment,U),ln=!1},d(U){U&&(l(c),l(i),l(I),l(Z),l(_),l($),l(G),l(Q),l(O),l(W),l(P),l(X),l(z),l(K),l(E),l(L),l(hn),l(nn)),T(b,U),T(g,U),T(f,U),T(N,U),T(A,U),T(Y,U),T(R,U)}}}function fc(v){let c,j="💡 Nếu thư mục đầu ra bạn đang sử dụng đã tồn tại, nó cần phải là bản sao cục bộ của kho lưu trữ mà bạn muốn đẩy đến. Nếu không, bạn sẽ gặp lỗi khi xác định <code>Seq2SeqTrainer</code> của mình và sẽ cần đặt tên mới.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-1jg226a"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function kc(v){let c,j="💡 Nếu thư mục đầu ra bạn đang sử dụng đã tồn tại, nó cần phải là bản sao cục bộ của kho lưu trữ mà bạn muốn đẩy đến. Nếu không, bạn sẽ gặp lỗi khi gọi <code>model.fit()</code> và sẽ cần đặt tên mới.";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-1vbugor"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function La(v){let c,j,i,b='Bây giờ chúng ta hãy xem toàn bộ vòng lặp huấn luyện, vì vậy bạn có thể dễ dàng tùy chỉnh các phần bạn cần. Nó sẽ trông rất giống những gì chúng ta đã làm trong <a href="/course/chapter7/2">phần 2</a> và <a href="/course/chapter3/4">Chương 3</a>.',I,g,Z,_,B="Bạn đã thấy tất cả điều này một vài lần rồi, vì vậy chúng ta sẽ xem qua đoạn mã khá nhanh. Đầu tiên, chúng ta sẽ xây dựng các <code>DataLoader</code> từ các tập dữ liệu của mình, sau khi đặt các tập dữ liệu thành định dạng<code>&quot;torch&quot;</code>để chúng ta nhận được các tensor PyTorch:",$,f,G,Q,cn="Tiếp theo, chúng ta khôi phục mô hình của mình, để đảm bảo rằng chúng ta không tiếp tục tinh chỉnh từ trước mà bắt đầu lại từ mô hình đã được huấn luyện trước:",O,N,W,P,Tn="Then we will need an optimizer:",X,A,z,K,dn="Khi chúng ta có tất cả các đối tượng đó, chúng ta có thể gửi chúng đến phương thức <code>accelerator.prepare()</code>. Hãy nhớ rằng nếu bạn muốn huấn luyện về TPU trong notebook Colab, bạn sẽ cần chuyển tất cả mã này vào một hàm huấn luyện và điều đó sẽ không thực thi bất kỳ ô nào khởi tạo một <code>Accelerator</code>.",E,Y,L,R,hn="Bây giờ, chúng ta đã gửi <code>train_dataloader</code> của mình tới <code>accelerator.prepare()</code>, chúng ta có thể sử dụng độ dài của nó để tính số bước huấn luyện. Hãy nhớ rằng chúng ta phải luôn làm điều này sau khi chuẩn bị dataloader, vì phương thức đó sẽ thay đổi độ dài của <code>DataLoader</code>. Chúng ta sử dụng một lịch trình tuyến tính cổ điển từ tốc độ học đến 0:",nn,V,ln,U,x="Cuối cùng, để đẩy mô hình của mình lên Hub, chúng ta sẽ cần tạo một đối tượng <code>Repository</code> trong một thư mục đang làm việc. Đầu tiên hãy đăng nhập vào Hugging Face Hub, nếu bạn chưa đăng nhập. Chúng ta sẽ xác định tên kho lưu trữ từ ID mô hình mà chúng ta muốn cung cấp cho mô hình của mình (vui lòng thay thế <code>repo_name</code> bằng sự lựa chọn của riêng bạn; nó chỉ cần chứa tên người dùng của bạn, đó là những gì hàm <code>get_full_repo_name()</code> thực hiện):",gn,mn,tn,vn,wn,F,Yn="Sau đó, chúng ta có thể sao chép kho lưu trữ đó trong một thư mục cục bộ. Nếu nó đã tồn tại, thư mục cục bộ này phải là bản sao của kho lưu trữ mà chúng ta đang làm việc:",yn,pn,fn,S,_n="Bây giờ chúng ta có thể tải lên bất cứ thứ gì chúng ta lưu trong <code>output_dir</code> bằng cách gọi phương thức <code>repo.push_to_hub()</code>. Điều này sẽ giúp chúng ta tải lên các mô hình trung gian ở cuối mỗi epoch.",en,Zn,kn,q,Fn="Bây giờ chúng ta đã sẵn sàng để viết vòng lặp huấn luyện đầy đủ. Để đơn giản hóa phần đánh giá của nó, chúng ta định nghĩa hàm <code>postprocess()</code> này lấy các dự đoán và nhãn và chuyển đổi chúng thành danh sách các chuỗi mà đối tượng <code>metric</code> kì vọng:",un,Mn,Cn,H,Dn='Vòng lặp huấn luyện trông rất giống với các vòng lặp trong <a href="/course/chapter7/2">phần 2</a> và <a href="/course/chapter3">Chương 3</a>, với một vài điểm khác biệt trong phần đánh giá - vì vậy hãy tập trung vào điều đó!',In,D,Sn="Điều đầu tiên cần lưu ý là chúng ta sử dụng phương thức <code>generate()</code> để tính toán các dự đoán, nhưng đây là một phương thức trên mô hình cơ sở, không phải mô hình được bao bọc 🤗 Accelerate được tạo trong phương thức <code>prepare()</code> . Đó là lý do tại sao chúng ta mở mô hình trước, sau đó gọi phương thức này.",on,rn,Gn='Điều thứ hai là, giống như với <a href="/course/chapter7/2">phân loại token</a>, hai quy trình có thể đã đêm các đầu vào và nhãn thành các hình dạng khác nhau, vì vậy chúng tôi sử dụng <code>accelerator.pad_across_processes()</code> để đưa ra các dự đoán và nhãn cùng một hình dạng trước khi gọi phương thức <code>gather()</code> . Nếu chúng ta không làm điều này, đánh giá sẽ bị lỗi hoặc bị treo vĩnh viễn.',sn,Un,Jn,p,C,bn,tl='Khi điều này được thực hiện, bạn sẽ có một mô hình có kết quả khá giống với mô hình được huấn luyện với <code>Seq2SeqTrainer</code>. Bạn có thể kiểm tra đoạn mã mà chúng ta đã huấn luyện bằng cách sử dụng mã này tại <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>. Và nếu bạn muốn kiểm tra bất kỳ tinh chỉnh nào đối với vòng lặp huấn luyện, bạn có thể trực tiếp thực hiện chúng bằng cách chỉnh sửa đoạn mã được hiển thị ở trên!',Bn;return c=new xn({props:{title:"Một vòng huấn luyện tùy chỉnh",local:"một-vòng-huấn-luyện-tùy-chỉnh",headingTag:"h2"}}),g=new xn({props:{title:"Chuẩn bị mọi thứ cho qua trình huấn luyện",local:"chuẩn-bị-mọi-thứ-cho-qua-trình-huấn-luyện",headingTag:"h3"}}),f=new w({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}}),N=new w({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JTZXEyU2VxTE0uZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NoZWNrcG9pbnQp",highlighted:"model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)",wrap:!1}}),A=new w({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}}),Y=new w({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}}),V=new w({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}}),mn=new w({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}}),vn=new w({props:{code:"J3NndWdnZXIlMkZtYXJpYW4tZmluZXR1bmVkLWtkZTQtZW4tdG8tZnItYWNjZWxlcmF0ZSc=",highlighted:'<span class="hljs-string">&#x27;sgugger/marian-finetuned-kde4-en-to-fr-accelerate&#x27;</span>',wrap:!1}}),pn=new w({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}}),Zn=new xn({props:{title:"Vòng lặp huấn luyện",local:"vòng-lặp-huấn-luyện",headingTag:"h3"}}),Mn=new w({props:{code:"ZGVmJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnMlMkMlMjBsYWJlbHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBwcmVkaWN0aW9ucy5jcHUoKS5udW1weSgpJTBBJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwbGFiZWxzLmNwdSgpLm51bXB5KCklMEElMEElMjAlMjAlMjAlMjBkZWNvZGVkX3ByZWRzJTIwJTNEJTIwdG9rZW5pemVyLmJhdGNoX2RlY29kZShwcmVkaWN0aW9ucyUyQyUyMHNraXBfc3BlY2lhbF90b2tlbnMlM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMFRoYXklMjAtMTAwJTIwdHJvbmclMjBuaCVDMyVBM24lMjB2JUMzJUFDJTIwdGElMjBraCVDMyVCNG5nJTIwdGglRTElQkElQkYlMjBnaSVFMSVCQSVBM2klMjBtJUMzJUEzJTIwY2glQzMlQkFuZy4lMEElMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBucC53aGVyZShsYWJlbHMlMjAhJTNEJTIwLTEwMCUyQyUyMGxhYmVscyUyQyUyMHRva2VuaXplci5wYWRfdG9rZW5faWQpJTBBJTIwJTIwJTIwJTIwZGVjb2RlZF9sYWJlbHMlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKGxhYmVscyUyQyUyMHNraXBfc3BlY2lhbF90b2tlbnMlM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMFRoJUUxJUJCJUIxYyUyMGhpJUUxJUJCJTg3biUyMG0lRTElQkIlOTl0JTIwcyVFMSVCQiU5MSUyMGglRTElQkElQUR1JTIweCVFMSVCQiVBRCUyMGwlQzMlQkQlMjAlQzQlOTElQzYlQTFuJTIwZ2klRTElQkElQTNuJTBBJTIwJTIwJTIwJTIwZGVjb2RlZF9wcmVkcyUyMCUzRCUyMCU1QnByZWQuc3RyaXAoKSUyMGZvciUyMHByZWQlMjBpbiUyMGRlY29kZWRfcHJlZHMlNUQlMEElMjAlMjAlMjAlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsLnN0cmlwKCklNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwZGVjb2RlZF9sYWJlbHMlNUQlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBkZWNvZGVkX3ByZWRzJTJDJTIwZGVjb2RlZF9sYWJlbHM=",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"># Thay -100 trong nhãn vì ta không thế giải mã chúng.</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"># Thực hiện một số hậu xử lý đơn giản</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}}),Un=new w({props:{code:"ZnJvbSUyMHRxZG0uYXV0byUyMGltcG9ydCUyMHRxZG0lMEFpbXBvcnQlMjB0b3JjaCUwQSUwQXByb2dyZXNzX2JhciUyMCUzRCUyMHRxZG0ocmFuZ2UobnVtX3RyYWluaW5nX3N0ZXBzKSklMEElMEFmb3IlMjBlcG9jaCUyMGluJTIwcmFuZ2UobnVtX3RyYWluX2Vwb2NocyklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBIdSVFMSVCQSVBNW4lMjBsdXklRTElQkIlODduJTBBJTIwJTIwJTIwJTIwbW9kZWwudHJhaW4oKSUwQSUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjB0cmFpbl9kYXRhbG9hZGVyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMCUzRCUyMG1vZGVsKCoqYmF0Y2gpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zcyUyMCUzRCUyMG91dHB1dHMubG9zcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLmJhY2t3YXJkKGxvc3MpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3B0aW1pemVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxyX3NjaGVkdWxlci5zdGVwKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuemVyb19ncmFkKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcm9ncmVzc19iYXIudXBkYXRlKDEpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUM0JTkwJUMzJUExbmglMjBnaSVDMyVBMSUwQSUyMCUyMCUyMCUyMG1vZGVsLmV2YWwoKSUwQSUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjB0cWRtKGV2YWxfZGF0YWxvYWRlciklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZ2VuZXJhdGVkX3Rva2VucyUyMCUzRCUyMGFjY2VsZXJhdG9yLnVud3JhcF9tb2RlbChtb2RlbCkuZ2VuZXJhdGUoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmF0Y2glNUIlMjJpbnB1dF9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhdHRlbnRpb25fbWFzayUzRGJhdGNoJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtYXhfbGVuZ3RoJTNEMTI4JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGJhdGNoJTVCJTIybGFiZWxzJTIyJTVEJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQyVFMSVCQSVBN24lMjAlQzQlOTElRTElQkIlODdtJTIwZCVFMSVCQiVCMSUyMCVDNCU5MW8lQzMlQTFuJTIwdiVDMyVBMCUyMG5oJUMzJUEzbiUyMCVDNCU5MSVFMSVCQiU4MyUyMGQlRTElQkIlODUlMjBnb20lMjBsJUUxJUJBJUExaSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdlbmVyYXRlZF90b2tlbnMlMjAlM0QlMjBhY2NlbGVyYXRvci5wYWRfYWNyb3NzX3Byb2Nlc3NlcyglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBnZW5lcmF0ZWRfdG9rZW5zJTJDJTIwZGltJTNEMSUyQyUyMHBhZF9pbmRleCUzRHRva2VuaXplci5wYWRfdG9rZW5faWQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGFiZWxzJTIwJTNEJTIwYWNjZWxlcmF0b3IucGFkX2Fjcm9zc19wcm9jZXNzZXMobGFiZWxzJTJDJTIwZGltJTNEMSUyQyUyMHBhZF9pbmRleCUzRC0xMDApJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZGljdGlvbnNfZ2F0aGVyZWQlMjAlM0QlMjBhY2NlbGVyYXRvci5nYXRoZXIoZ2VuZXJhdGVkX3Rva2VucyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbHNfZ2F0aGVyZWQlMjAlM0QlMjBhY2NlbGVyYXRvci5nYXRoZXIobGFiZWxzKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlY29kZWRfcHJlZHMlMkMlMjBkZWNvZGVkX2xhYmVscyUyMCUzRCUyMHBvc3Rwcm9jZXNzKHByZWRpY3Rpb25zX2dhdGhlcmVkJTJDJTIwbGFiZWxzX2dhdGhlcmVkKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG1ldHJpYy5hZGRfYmF0Y2gocHJlZGljdGlvbnMlM0RkZWNvZGVkX3ByZWRzJTJDJTIwcmVmZXJlbmNlcyUzRGRlY29kZWRfbGFiZWxzKSUwQSUwQSUyMCUyMCUyMCUyMHJlc3VsdHMlMjAlM0QlMjBtZXRyaWMuY29tcHV0ZSgpJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMmVwb2NoJTIwJTdCZXBvY2glN0QlMkMlMjBCTEVVJTIwc2NvcmUlM0ElMjAlN0JyZXN1bHRzJTVCJ3Njb3JlJyU1RCUzQS4yZiU3RCUyMiklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBMJUM2JUIwdSUyMHYlQzMlQTAlMjB0JUUxJUJBJUEzaSUwQSUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLndhaXRfZm9yX2V2ZXJ5b25lKCklMEElMjAlMjAlMjAlMjB1bndyYXBwZWRfbW9kZWwlMjAlM0QlMjBhY2NlbGVyYXRvci51bndyYXBfbW9kZWwobW9kZWwpJTBBJTIwJTIwJTIwJTIwdW53cmFwcGVkX21vZGVsLnNhdmVfcHJldHJhaW5lZChvdXRwdXRfZGlyJTJDJTIwc2F2ZV9mdW5jdGlvbiUzRGFjY2VsZXJhdG9yLnNhdmUpJTBBJTIwJTIwJTIwJTIwaWYlMjBhY2NlbGVyYXRvci5pc19tYWluX3Byb2Nlc3MlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0b2tlbml6ZXIuc2F2ZV9wcmV0cmFpbmVkKG91dHB1dF9kaXIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVwby5wdXNoX3RvX2h1YiglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb21taXRfbWVzc2FnZSUzRGYlMjJUcmFpbmluZyUyMGluJTIwcHJvZ3Jlc3MlMjBlcG9jaCUyMCU3QmVwb2NoJTdEJTIyJTJDJTIwYmxvY2tpbmclM0RGYWxzZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCk=",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"># Huấn luyện</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"># Đánh giá</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"># Cần đệm dự đoán và nhãn để dễ gom lại</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"># Lưu và tải</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}}),p=new w({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(){u(c.$$.fragment),j=s(),i=m("p"),i.innerHTML=b,I=s(),u(g.$$.fragment),Z=s(),_=m("p"),_.innerHTML=B,$=s(),u(f.$$.fragment),G=s(),Q=m("p"),Q.textContent=cn,O=s(),u(N.$$.fragment),W=s(),P=m("p"),P.textContent=Tn,X=s(),u(A.$$.fragment),z=s(),K=m("p"),K.innerHTML=dn,E=s(),u(Y.$$.fragment),L=s(),R=m("p"),R.innerHTML=hn,nn=s(),u(V.$$.fragment),ln=s(),U=m("p"),U.innerHTML=x,gn=s(),u(mn.$$.fragment),tn=s(),u(vn.$$.fragment),wn=s(),F=m("p"),F.textContent=Yn,yn=s(),u(pn.$$.fragment),fn=s(),S=m("p"),S.innerHTML=_n,en=s(),u(Zn.$$.fragment),kn=s(),q=m("p"),q.innerHTML=Fn,un=s(),u(Mn.$$.fragment),Cn=s(),H=m("p"),H.innerHTML=Dn,In=s(),D=m("p"),D.innerHTML=Sn,on=s(),rn=m("p"),rn.innerHTML=Gn,sn=s(),u(Un.$$.fragment),Jn=s(),u(p.$$.fragment),C=s(),bn=m("p"),bn.innerHTML=tl},l(h){o(c.$$.fragment,h),j=a(h),i=y(h,"P",{"data-svelte-h":!0}),d(i)!=="svelte-1vzu1n4"&&(i.innerHTML=b),I=a(h),o(g.$$.fragment,h),Z=a(h),_=y(h,"P",{"data-svelte-h":!0}),d(_)!=="svelte-mtb390"&&(_.innerHTML=B),$=a(h),o(f.$$.fragment,h),G=a(h),Q=y(h,"P",{"data-svelte-h":!0}),d(Q)!=="svelte-rzppnb"&&(Q.textContent=cn),O=a(h),o(N.$$.fragment,h),W=a(h),P=y(h,"P",{"data-svelte-h":!0}),d(P)!=="svelte-47lq6z"&&(P.textContent=Tn),X=a(h),o(A.$$.fragment,h),z=a(h),K=y(h,"P",{"data-svelte-h":!0}),d(K)!=="svelte-u0izcb"&&(K.innerHTML=dn),E=a(h),o(Y.$$.fragment,h),L=a(h),R=y(h,"P",{"data-svelte-h":!0}),d(R)!=="svelte-1vp141b"&&(R.innerHTML=hn),nn=a(h),o(V.$$.fragment,h),ln=a(h),U=y(h,"P",{"data-svelte-h":!0}),d(U)!=="svelte-itdnx7"&&(U.innerHTML=x),gn=a(h),o(mn.$$.fragment,h),tn=a(h),o(vn.$$.fragment,h),wn=a(h),F=y(h,"P",{"data-svelte-h":!0}),d(F)!=="svelte-1yyb0p9"&&(F.textContent=Yn),yn=a(h),o(pn.$$.fragment,h),fn=a(h),S=y(h,"P",{"data-svelte-h":!0}),d(S)!=="svelte-ahqxuc"&&(S.innerHTML=_n),en=a(h),o(Zn.$$.fragment,h),kn=a(h),q=y(h,"P",{"data-svelte-h":!0}),d(q)!=="svelte-1m6dupy"&&(q.innerHTML=Fn),un=a(h),o(Mn.$$.fragment,h),Cn=a(h),H=y(h,"P",{"data-svelte-h":!0}),d(H)!=="svelte-1rf0fyi"&&(H.innerHTML=Dn),In=a(h),D=y(h,"P",{"data-svelte-h":!0}),d(D)!=="svelte-ry3nt8"&&(D.innerHTML=Sn),on=a(h),rn=y(h,"P",{"data-svelte-h":!0}),d(rn)!=="svelte-y4enw0"&&(rn.innerHTML=Gn),sn=a(h),o(Un.$$.fragment,h),Jn=a(h),o(p.$$.fragment,h),C=a(h),bn=y(h,"P",{"data-svelte-h":!0}),d(bn)!=="svelte-1b9yxno"&&(bn.innerHTML=tl)},m(h,k){J(c,h,k),t(h,j,k),t(h,i,k),t(h,I,k),J(g,h,k),t(h,Z,k),t(h,_,k),t(h,$,k),J(f,h,k),t(h,G,k),t(h,Q,k),t(h,O,k),J(N,h,k),t(h,W,k),t(h,P,k),t(h,X,k),J(A,h,k),t(h,z,k),t(h,K,k),t(h,E,k),J(Y,h,k),t(h,L,k),t(h,R,k),t(h,nn,k),J(V,h,k),t(h,ln,k),t(h,U,k),t(h,gn,k),J(mn,h,k),t(h,tn,k),J(vn,h,k),t(h,wn,k),t(h,F,k),t(h,yn,k),J(pn,h,k),t(h,fn,k),t(h,S,k),t(h,en,k),J(Zn,h,k),t(h,kn,k),t(h,q,k),t(h,un,k),J(Mn,h,k),t(h,Cn,k),t(h,H,k),t(h,In,k),t(h,D,k),t(h,on,k),t(h,rn,k),t(h,sn,k),J(Un,h,k),t(h,Jn,k),J(p,h,k),t(h,C,k),t(h,bn,k),Bn=!0},i(h){Bn||(M(c.$$.fragment,h),M(g.$$.fragment,h),M(f.$$.fragment,h),M(N.$$.fragment,h),M(A.$$.fragment,h),M(Y.$$.fragment,h),M(V.$$.fragment,h),M(mn.$$.fragment,h),M(vn.$$.fragment,h),M(pn.$$.fragment,h),M(Zn.$$.fragment,h),M(Mn.$$.fragment,h),M(Un.$$.fragment,h),M(p.$$.fragment,h),Bn=!0)},o(h){r(c.$$.fragment,h),r(g.$$.fragment,h),r(f.$$.fragment,h),r(N.$$.fragment,h),r(A.$$.fragment,h),r(Y.$$.fragment,h),r(V.$$.fragment,h),r(mn.$$.fragment,h),r(vn.$$.fragment,h),r(pn.$$.fragment,h),r(Zn.$$.fragment,h),r(Mn.$$.fragment,h),r(Un.$$.fragment,h),r(p.$$.fragment,h),Bn=!1},d(h){h&&(l(j),l(i),l(I),l(Z),l(_),l($),l(G),l(Q),l(O),l(W),l(P),l(X),l(z),l(K),l(E),l(L),l(R),l(nn),l(ln),l(U),l(gn),l(tn),l(wn),l(F),l(yn),l(fn),l(S),l(en),l(kn),l(q),l(un),l(Cn),l(H),l(In),l(D),l(on),l(rn),l(sn),l(Jn),l(C),l(bn)),T(c,h),T(g,h),T(f,h),T(N,h),T(A,h),T(Y,h),T(V,h),T(mn,h),T(vn,h),T(pn,h),T(Zn,h),T(Mn,h),T(Un,h),T(p,h)}}}function Cc(v){let c,j="✏️ <strong>Đến lượt bạn!</strong> Mô hình trả về cái gì với từ “email” bạn xác định trước đó?";return{c(){c=m("p"),c.innerHTML=j},l(i){c=y(i,"P",{"data-svelte-h":!0}),d(c)!=="svelte-1xx7h46"&&(c.innerHTML=j)},m(i,b){t(i,c,b)},p:qn,d(i){i&&l(c)}}}function Ic(v){let c,j,i,b,I,g,Z,_,B,$,f,G,Q,cn,O='Bây giờ chúng ta hãy đi sâu vào dịch máy. Đây là một <a href="/course/chapter1/7">tác vụ chuỗi sang chuỗi</a>, có nghĩa là đây là một vấn đề có thể được hình thành như đi từ một chuỗi này sang chuỗi khác. Theo nghĩa đó, vấn đề khá giống với <a href="/course/chapter7/6">tóm tắt</a> và bạn có thể điều chỉnh những gì chúng ta sẽ thấy ở đây thành các vấn đề chuỗi sang chuỗi khác như:',N,W,P="<li><strong>Chuyển văn phong</strong>: Tạo mô hình <em>dịch</em> văn bản được viết theo một phong cách nhất định sang một phong cách khác (ví dụ: từ trang trọng sang thông thường hoặc tiếng Anh Shakespearean sang tiếng Anh hiện đại)</li> <li><strong>Hỏi đáp chung</strong>: Tạo một mô hình tạo câu trả lời cho các câu hỏi, dựa trên ngữ cảnh</li>",Tn,X,A,z,K='Nếu bạn có một kho văn bản đủ lớn với hai (hoặc nhiều) ngôn ngữ, bạn có thể huấn luyện một mô hình dịch mới từ đầu giống như chúng ta sẽ làm trong phần <a href="/course/chapter7/6">lập mô hình ngôn ngữ nhân quả</a>. Tuy nhiên, sẽ nhanh hơn nếu tinh chỉnh mô hình dịch hiện có, có thể là mô hình đa ngôn ngữ như mT5 hoặc mBART mà bạn muốn tinh chỉnh cho phù hợp với một cặp ngôn ngữ cụ thể hoặc thậm chí là một mô hình chuyên dụng để dịch từ ngôn ngữ này sang ngôn ngữ khác mà bạn muốn tinh chỉnh để phù hợp với kho dữ liệu cụ thể của mình.',dn,E,Y='Trong phần này, chúng ta sẽ tinh chỉnh mô hình Marian được huấn luyện trước để dịch từ tiếng Anh sang tiếng Pháp (vì rất nhiều nhân viên của Hugging Face nói cả hai ngôn ngữ đó) trên <a href="https://huggingface.co/datasets/kde4" rel="nofollow">tập dữ liệu KDE4</a>, là tập dữ liệu các tệp được bản địa hóa cho <a href="https://apps.kde.org/" rel="nofollow">ứng dụng KDE</a>. Mô hình chúng ta sẽ sử dụng đã được huấn luyện trước trên một kho dữ liệu lớn gồm các văn bản tiếng Pháp và tiếng Anh được lấy từ <a href="https://opus.nlpl.eu/" rel="nofollow">Tập dữ liệu Opus</a>, thực sự chứa tập dữ liệu KDE4. Nhưng ngay cả khi mô hình huấn luyện trước mà chúng ta sử dụng đã nhìn thấy dữ liệu đó trong quá trình huấn luyện trước của nó, chúng ta sẽ thấy rằng ta có thể nhận được phiên bản tốt hơn của nó sau khi tinh chỉnh.',L,R,hn="Sau khi hoàn thành, chúng ta sẽ có một mô hình có thể đưa ra các dự đoán như sau:",nn,V,ln,U,x,gn='<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."/>',mn,tn,vn='Như trong các phần trước, bạn có thể tìm thấy mô hình thực tế mà chúng ta sẽ huấn luyện và tải lên Hub bằng cách sử dụng đoạn mã bên dưới và kiểm tra kỹ các dự đoán của nó <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">tại đây</a>.',wn,F,Yn,yn,pn='Để tinh chỉnh hoặc huấn luyện một mô hình dịch từ đầu, chúng ta sẽ cần một tập dữ liệu phù hợp với tác vụ. Như đã đề cập trước đây, chúng ta sẽ sử dụng <a href="https://huggingface.co/datasets/kde4" rel="nofollow">tập dữ liệu KDE4</a> trong phần này, nhưng bạn có thể điều chỉnh đoạn mã để sử dụng dữ liệu của riêng mình khá dễ dàng, miễn là bạn có các cặp của các câu bằng hai ngôn ngữ mà bạn muốn dịch từ và tới. Tham khảo lại <a href="/course/chapter5">Chương 5</a> nếu bạn cần lời nhắc về cách tải dữ liệu tùy chỉnh của mình trong <code>Dataset</code>.',fn,S,_n,en,Zn="Như thường lệ, chúng ta tải xuống tập dữ liệu của mình bằng cách sử dụng hàm <code>load_dataset()</code>:",kn,q,Fn,un,Mn='Nếu bạn muốn làm việc với một cặp ngôn ngữ khác, bạn có thể chỉ định chúng bằng đoạn mã của chúng. Có tổng số 92 ngôn ngữ có sẵn cho bộ dữ liệu này; bạn có thể thấy tất cả chúng bằng cách mở rộng các thẻ ngôn ngữ trên <a href="https://huggingface.co/datasets/kde4" rel="nofollow">thẻ dữ liệu</a> của nó.',Cn,H,Dn,In,D,Sn="Hãy xem tập dữ liệu:",on,rn,Gn,sn,Un,Jn,p='Chúng ta có 210,173 cặp câu, nhưng chỉ trong một lần tách, vì vậy chúng ta sẽ cần tạo bộ kiểm định của riêng mình. Như chúng ta đã thấy trong <a href="/course/chapter5">Chương 5</a>, <code>Dataset</code> có phương thức <code>train_test_split()</code> có thể giúp chúng ta. Chúng ta sẽ cung cấp một hạt giống (seed) cho khả năng tái tạo:',C,bn,tl,Bn,h,k,Hs="Bạn có thể đổi <code>&quot;test&quot;</code> thành <code>&quot;validation&quot;</code> như sau:",Pt,el,Kt,sl,Ys="Bây giờ chúng ta hãy xem xét một phần tử của tập dữ liệu:",Ot,al,ne,cl,le,hl,Fs="Chúng ta nhận được một từ điển có hai câu bằng cặp ngôn ngữ mà ta yêu cầu. Một điểm đặc biệt của bộ dữ liệu đầy đủ các thuật ngữ khoa học máy tính kỹ thuật này là chúng đều được dịch hoàn toàn bằng tiếng Pháp. Tuy nhiên, các kỹ sư Pháp thường lười biếng và để lại hầu hết các từ chuyên ngành khoa học máy tính bằng tiếng Anh khi họ nói chuyện. Ví dụ, ở đây, từ “threads” có thể xuất hiện trong một câu tiếng Pháp, đặc biệt là trong một cuộc trò chuyện kỹ thuật; nhưng trong tập dữ liệu này, nó đã được dịch thành đúng hơn là “fils de discussion”. Mô hình huấn luyện trước mà chúng ta sử dụng, đã được huấn luyện trước trên một kho ngữ liệu lớn hơn của các câu tiếng Pháp và tiếng Anh, có tùy chọn dễ dàng hơn là để nguyên từ như sau:",te,il,ee,pl,se,Ml,Ss=`Một ví dụ khác về hành vi này có thể được nhìn thấy với từ “plugin”, đây không phải là một từ chính thức trong tiếng Pháp nhưng hầu hết người bản ngữ sẽ hiểu và không bận tâm đến việc dịch.
Trong tập dữ liệu KDE4, từ này đã được dịch bằng tiếng Pháp một cách chính thống hơn thành “module d’extension”:`,ae,rl,ce,ml,he,yl,qs="Tuy nhiên, mô hình được huấn luyện trước của chúng ta gắn với từ tiếng Anh nhỏ gọn và quen thuộc:",ie,ul,pe,ol,Me,Jl,Ds="Sẽ rất thú vị khi xem liệu mô hình tinh chỉnh của mình có tiếp thu những đặc điểm đó của tập dữ liệu hay không (cảnh báo spoiler: nó sẽ xảy ra).",re,Tl,me,Ln,ye,dl,ue,gl,oe,Ul,Ls='Bây giờ bạn nên biết điều này: tất cả các văn bản cần được chuyển đổi thành tập hợp các token ID để mô hình có thể hiểu được chúng. Đối với tác vụ này, chúng ta sẽ cần tokenize cả đầu vào và nhãn. Tác vụ đầu tiên của chúng ta là tạo đối tượng <code>tokenizer</code>. Như đã lưu ý trước đó, chúng ta sẽ sử dụng mô hình huấn luyện trước từ tiếng Anh sang tiếng Pháp của Marian. Nếu bạn đang thử đoạn mã này với một cặp ngôn ngữ khác, hãy đảm bảo điều chỉnh checkpoint của mô hình. Tổ chức <a href="https://huggingface.co/Helsinki-NLP" rel="nofollow">Helsinki-NLP</a> cung cấp hơn một nghìn mô hình bằng nhiều ngôn ngữ.',Je,bl,Te,jl,Ps='You can also replace the <code>model_checkpoint</code> with any other model you prefer from the <a href="https://huggingface.co/models" rel="nofollow">Hub</a>, or a local folder where you’ve saved a pretrained model and a tokenizer.',de,Pn,ge,wl,Ks="Việc chuẩn bị dữ liệu của chúng ta khá đơn giản. Chỉ có một điều cần nhớ: bạn xử lý các đầu vào như bình thường, nhưng đối với các nhãn, bạn cần phải bọc tokenizer bên trong trình quản lý ngữ cảnh <code>as_target_tokenizer()</code>.",Ue,fl,Os="Trình quản lý ngữ cảnh trong Python được giới thiệu với câu lệnh <code>with</code> và rất hữu ích khi bạn có hai hoạt động liên quan để thực thi như một cặp. Ví dụ phổ biến nhất về điều này là khi bạn viết hoặc đọc một tệp, thường được thực hiện bên trong một lệnh như:",be,kl,je,Cl,na="Ở đây, hai hoạt động liên quan được thực hiện như một cặp là các hành động mở và đóng tệp. Đối tượng tương ứng với tệp đã mở <code>f</code> chỉ tồn tại bên trong khối được thụt lề dưới dấu <code>with</code>; sự mở đầu xảy ra trước khối đó và đóng ở cuối khối.",we,Il,la="Trong trường hợp này, trình quản lý ngữ cảnh <code>as_target_tokenizer()</code> sẽ đặt tokenizer ở ngôn ngữ đầu ra (ở đây, tiếng Pháp) trước khi khối được thụt lề được thực thi, sau đó đặt nó trở lại bằng ngôn ngữ đầu vào (ở đây, tiếng Anh).",fe,$l,ta="Vì vậy, việc xử lý trước một mẫu trông như thế này:",ke,vl,Ce,Zl,ea="Nếu chúng ta quên tokenize các nhãn bên trong trình quản lý ngữ cảnh, chúng sẽ được tokenize bởi trình tokenize đầu vào, trong trường hợp mô hình Marian sẽ không hoạt động tốt chút nào:",Ie,xl,$e,_l,ve,Gl,sa="Như chúng ta có thể thấy, việc sử dụng trình tokenize tiếng Anh để xử lý trước một câu tiếng Pháp dẫn đến nhiều token hơn, vì trình tokenize không biết bất kỳ từ tiếng Pháp nào (ngoại trừ những từ cũng xuất hiện trong tiếng Anh, như “discussion”).",Ze,Bl,aa="Cả <code>inputs</code> và <code>targets</code> đều là từ điển với các khóa thông thường của chúng ta (ID đầu vào, attention mask, v.v.), vì vậy bước cuối cùng là đặt <code>&quot;labels&quot;</code> bên trong các đầu vào. Chúng ta thực hiện điều này trong chức năng tiền xử lý mà ta sẽ áp dụng trên các tập dữ liệu:",xe,Vl,_e,Rl,ca="Note that we set similar maximum lengths for our inputs and outputs. Since the texts we’re dealing with seem pretty short, we use 128.",Ge,Kn,Be,On,Ve,Ql,ha="Bây giờ chúng ta có thể áp dụng tiền xử lý đó trong một lần trên tất cả các phần của tập dữ liệu của mình:",Re,Nl,Qe,Wl,ia="Bây giờ dữ liệu đã được tiền xử lý, chúng ta đã sẵn sàng để tinh chỉnh mô hình tiền xử lý của mình!",Ne,Vn,Rn,Et,Xl,pa="Lưu ý rằng lần này chúng ta đang sử dụng một mô hình đã được huấn luyện về tác vụ dịch và thực sự có thể được sử dụng, vì vậy không có cảnh báo nào về việc thiếu các trọng số hoặc những trọng số mới được khởi tạo.",We,Al,Xe,zl,Ma="Chúng ta sẽ cần một công cụ đối chiếu dữ liệu để xử lý phần đệm cho phân phối động. Chúng ta không thể chỉ sử dụng một <code>DataCollatorWithPadding</code> như [Chương 3](/course/ chapter3) trong trường hợp này, bởi vì điều đó chỉ đệm các đầu vào (ID đầu vào, attention mask, và loại token ID). Các nhãn của chúng ta cũng phải được đệm theo chiều dài tối đa có trong nhãn. Và, như đã đề cập trước đây, giá trị đệm được sử dụng để đệm các nhãn phải là <code>-100</code> chứ không phải token đệm của trình tokenize, để đảm bảo các giá trị đệm đó bị bỏ qua trong tính toán mất mát.",Ae,El,ra='Tất cả điều này được thực hiện bởi <a href="https://huggingface.co/transformers/main_classes/data_collator.html#datacollatorforseq2seq" rel="nofollow"><code>DataCollatorForSeq2Seq</code></a>. Giống như <code>DataCollatorWithPadding</code>, nó sử dụng <code>tokenizer</code> được sử dụng để xử lý trước các đầu vào, nhưng nó cũng lấy <code>model</code>. Điều này là do trình đối chiếu dữ liệu này cũng sẽ chịu trách nhiệm chuẩn bị các ID đầu vào của bộ giải mã, là các phiên bản được dịch chuyển của các nhãn với một token đặc biệt ở đầu. Vì sự thay đổi này được thực hiện hơi khác đối với các kiến ​​trúc khác nhau, nên <code>DataCollatorForSeq2Seq</code> cần biết đối tượng <code>model</code>:',ze,Qn,Nn,Ht,Hl,ma="Để kiểm tra điều này trên một số mẫu, chúng ta chỉ cần gọi nó trong danh sách các ví dụ từ bộ huấn luyện được tokenize của mình:",Ee,Yl,He,Fl,Ye,Sl,ya="Chúng tôi có thể kiểm tra nhãn đã được đệm đến độ dài tối đa của lô hay chưa, bằng cách sử dụng <code>-100</code>:",Fe,ql,Se,Dl,qe,Ll,ua="Và chúng tôi cũng có thể xem xét các ID đầu vào của bộ giải mã, để biết rằng chúng là các phiên bản được thay đổi của nhãn:",De,Pl,Le,Kl,Pe,Ol,oa="Dưới đây là các nhãn cho các phần tử đầu tiên và thứ hai trong tập dữ liệu của mình:",Ke,nt,Oe,lt,ns,Wn,Xn,Yt,tt,ls,et,ts,Ft,st,Ja='Chỉ số truyền thống được sử dụng cho bài toán dịch là <a href="https://en.wikipedia.org/wiki/BLEU" rel="nofollow">điểm BLEU</a>, được giới thiệu trong <a href="https://aclanthology.org/P02-1040.pdf" rel="nofollow">một bài báo năm 2002</a> bởi Kishore Papineni và cộng sự. Điểm BLEU đánh giá mức độ gần gũi của bản dịch với nhãn của chúng. Nó không đo lường mức độ dễ hiểu hoặc tính đúng ngữ pháp của các đầu ra được tạo ra của mô hình, nhưng sử dụng các quy tắc thống kê để đảm bảo rằng tất cả các từ trong các đầu ra được tạo cũng xuất hiện trong các nhãn. Ngoài ra, có các quy tắc phạt việc lặp lại các từ giống nhau nếu chúng không được lặp lại trong các nhãn (để tránh mô hình xuất ra các câu như <code>&quot;the the the&quot;</code>) và xuất ra các câu ngắn hơn các câu trong nhãn (để tránh mô hình xuất ra các câu như <code>&quot;the&quot;</code>).',es,at,Ta='Một điểm yếu của BLEU là nó mong đợi văn bản đã được tokenize, điều này gây khó khăn cho việc so sánh điểm giữa các mô hình sử dụng các bộ tokenize khác nhau. Vì vậy, thay vào đó, chỉ số được sử dụng phổ biến nhất cho các mô hình dịch điểm chuẩn ngày nay là <a href="https://github.com/mjpost/sacrebleu" rel="nofollow">SacreBLEU</a>, giải quyết điểm yếu này (và các chỉ số khác) bằng cách chuẩn hóa bước tokenize. Để sử dụng chỉ số này, trước tiên chúng ta cần cài đặt thư viện SacreBLEU:',ss,ct,as,ht,da='Chúng ta có thể tải nó với <code>evaluate.load()</code> như chúng ta đã làm trong <a href="/course/chapter3">Chương 3</a>:',cs,it,hs,pt,ga="Chỉ số này sẽ lấy văn bản làm đầu vào và nhãn. Nó được thiết kế để chấp nhận một số nhãn có thể chấp nhận được, vì thường có nhiều bản dịch có thể chấp nhận được của cùng một câu - tập dữ liệu ta đang sử dụng chỉ cung cấp một nhãn, nhưng không hiếm trong NLP để tìm tập dữ liệu cung cấp một số câu dưới dạng nhãn. Vì vậy, các dự đoán phải là một danh sách các câu, nhưng các tham chiếu phải là một danh sách các danh sách các câu.",is,Mt,Ua="Hãy thử một mẫu:",ps,rt,Ms,mt,rs,yt,ba='Ta nhận được điểm BLEU là 46.75, khá tốt - để tham khảo, mô hình Transformer ban đầu trong bài báo <a href="https://arxiv.org/pdf/1706.03762.pdf" rel="nofollow">“Attention Is All You Need”</a> đạt được điểm BLEU là 41.8 cho một tác vụ dịch tương tự giữa tiếng Anh và tiếng Pháp! (Để biết thêm thông tin về các chỉ số riêng lẻ, như <code>counts</code> và <code>bp</code>, hãy xem <a href="https://github.com/mjpost/sacrebleu/blob/078c440168c6adc89ba75fe6d63f0d922d42bcfe/sacrebleu/metrics/bleu.py#L74" rel="nofollow">kho lưu trữ SacreBLEU</a>.) Mặt khác, nếu chúng ta thử với hai loại dự đoán không tốt (nhiều lần lặp lại hoặc quá ngắn) thường xuất hiện trong các mô hình dịch, chúng ta sẽ nhận được điểm BLEU khá tệ:',ms,ut,ys,ot,us,Jt,os,Tt,Js,dt,ja="Điểm số có thể tăng từ 0 đến 100 và càng cao thì càng tốt.",Ts,An,zn,St,gt,wa="Bây giờ điều này đã hoàn tất, chúng ta đã sẵn sàng tinh chỉnh mô hình của mình!",ds,Ut,gs,bt,fa="Bước đầu tiên là đăng nhập vào Hugging Face để bạn có thể tải kết quả của mình lên Model Hub. Có một chức năng tiện lợi để giúp bạn làm điều này trong notebook:",Us,jt,bs,wt,ka="Thao tác này sẽ hiển thị một tiện ích mà bạn có thể nhập thông tin đăng nhập Hugging Face của mình.",js,ft,Ca="Nếu bạn không làm việc trong notebook, chỉ cần nhập dòng sau vào terminal của bạn:",ws,kt,fs,En,Hn,qt,Dt,Ct,ks,It,Ia="Chúng tôi đã chỉ cho bạn cách bạn có thể sử dụng mô hình mà ta đã tinh chỉnh trên Model Hub bằng tiện ích luận suy. Để sử dụng nó cục bộ trong một <code>pipeline</code>, chúng ta chỉ cần chỉ định mã định danh mô hình thích hợp:",Cs,$t,Is,vt,$s,Zt,$a="Đúng như mong đợi, mô hình được huấn luyện trước của chúng ta đã điều chỉnh kiến thức của nó cho phù hợp với kho ngữ liệu mà chúng ta đã tinh chỉnh và thay vì để nguyên từ “thread” trong tiếng Anh, giờ đây nó đã dịch nó sang phiên bản chính thức tiếng Pháp. Đối với “plugin” cũng vậy:",vs,xt,Zs,_t,xs,Gt,va="Một ví dụ tuyệt vời khác về thích ứng chuyện môn!",_s,nl,Gs,Bt,Bs,Lt,Vs;I=new cc({props:{fw:v[0]}}),Z=new sc({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),B=new xn({props:{title:"Dịch máy",local:"dịch-máy",headingTag:"h1"}});const Za=[ic,hc],Vt=[];function xa(n,e){return n[0]==="pt"?0:1}f=xa(v),G=Vt[f]=Za[f](v),X=new Rs({props:{id:"1JvfrvZgi6c"}}),F=new xn({props:{title:"Chuẩn bị dữ liệu",local:"chuẩn-bị-dữ-liệu",headingTag:"h2"}}),S=new xn({props:{title:"Bộ dữ liệu KDE4",local:"bộ-dữ-liệu-kde4",headingTag:"h3"}}),q=new w({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}}),rn=new w({props:{code:"cmF3X2RhdGFzZXRz",highlighted:"raw_datasets",wrap:!1}}),sn=new w({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}}),bn=new w({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}}),Bn=new w({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}}),el=new w({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}}),al=new w({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}}),cl=new w({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}}),il=new w({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}}),pl=new w({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}}),rl=new w({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}}),ml=new w({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}}),ul=new w({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}}),ol=new w({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}}),Tl=new Rs({props:{id:"0Oxphw4Q9fo"}}),Ln=new ll({props:{$$slots:{default:[pc]},$$scope:{ctx:v}}}),dl=new xn({props:{title:"Chuẩn bị dữ liệu",local:"chuẩn-bị-dữ-liệu",headingTag:"h3"}}),gl=new Rs({props:{id:"XAR8jnZZuUs"}}),bl=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIySGVsc2lua2ktTkxQJTJGb3B1cy1tdC1lbi1mciUyMiUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NoZWNrcG9pbnQlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnRmJTIyKQ==",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;tf&quot;</span>)`,wrap:!1}}),Pn=new ll({props:{$$slots:{default:[Mc]},$$scope:{ctx:v}}}),kl=new w({props:{code:"d2l0aCUyMG9wZW4oZmlsZV9wYXRoKSUyMGFzJTIwZiUzQSUwQSUyMCUyMCUyMCUyMGNvbnRlbnQlMjAlM0QlMjBmLnJlYWQoKQ==",highlighted:`<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(file_path) <span class="hljs-keyword">as</span> f:
    content = f.<span class="hljs-built_in">read</span>()`,wrap:!1}}),vl=new w({props:{code:"ZW5fc2VudGVuY2UlMjAlM0QlMjBzcGxpdF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMSU1RCU1QiUyMnRyYW5zbGF0aW9uJTIyJTVEJTVCJTIyZW4lMjIlNUQlMEFmcl9zZW50ZW5jZSUyMCUzRCUyMHNwbGl0X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIxJTVEJTVCJTIydHJhbnNsYXRpb24lMjIlNUQlNUIlMjJmciUyMiU1RCUwQSUwQWlucHV0cyUyMCUzRCUyMHRva2VuaXplcihlbl9zZW50ZW5jZSklMEF3aXRoJTIwdG9rZW5pemVyLmFzX3RhcmdldF90b2tlbml6ZXIoKSUzQSUwQSUyMCUyMCUyMCUyMHRhcmdldHMlMjAlM0QlMjB0b2tlbml6ZXIoZnJfc2VudGVuY2Up",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)
<span class="hljs-keyword">with</span> tokenizer.as_target_tokenizer():
    targets = tokenizer(fr_sentence)`,wrap:!1}}),xl=new w({props:{code:"d3JvbmdfdGFyZ2V0cyUyMCUzRCUyMHRva2VuaXplcihmcl9zZW50ZW5jZSklMEFwcmludCh0b2tlbml6ZXIuY29udmVydF9pZHNfdG9fdG9rZW5zKHdyb25nX3RhcmdldHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQpKSUwQXByaW50KHRva2VuaXplci5jb252ZXJ0X2lkc190b190b2tlbnModGFyZ2V0cyU1QiUyMmlucHV0X2lkcyUyMiU1RCkp",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(targets[<span class="hljs-string">&quot;input_ids&quot;</span>]))`,wrap:!1}}),_l=new w({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}}),Vl=new w({props:{code:"bWF4X2lucHV0X2xlbmd0aCUyMCUzRCUyMDEyOCUwQW1heF90YXJnZXRfbGVuZ3RoJTIwJTNEJTIwMTI4JTBBJTBBJTBBZGVmJTIwcHJlcHJvY2Vzc19mdW5jdGlvbihleGFtcGxlcyklM0ElMEElMjAlMjAlMjAlMjBpbnB1dHMlMjAlM0QlMjAlNUJleCU1QiUyMmVuJTIyJTVEJTIwZm9yJTIwZXglMjBpbiUyMGV4YW1wbGVzJTVCJTIydHJhbnNsYXRpb24lMjIlNUQlNUQlMEElMjAlMjAlMjAlMjB0YXJnZXRzJTIwJTNEJTIwJTVCZXglNUIlMjJmciUyMiU1RCUyMGZvciUyMGV4JTIwaW4lMjBleGFtcGxlcyU1QiUyMnRyYW5zbGF0aW9uJTIyJTVEJTVEJTBBJTIwJTIwJTIwJTIwbW9kZWxfaW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKGlucHV0cyUyQyUyMG1heF9sZW5ndGglM0RtYXhfaW5wdXRfbGVuZ3RoJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwVGhpJUUxJUJBJUJGdCUyMGwlRTElQkElQURwJTIwdG9rZW5pemVyJTIwY2hvJTIwbmglQzMlQTNuJTBBJTIwJTIwJTIwJTIwd2l0aCUyMHRva2VuaXplci5hc190YXJnZXRfdG9rZW5pemVyKCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjB0b2tlbml6ZXIodGFyZ2V0cyUyQyUyMG1heF9sZW5ndGglM0RtYXhfdGFyZ2V0X2xlbmd0aCUyQyUyMHRydW5jYXRpb24lM0RUcnVlKSUwQSUwQSUyMCUyMCUyMCUyMG1vZGVsX2lucHV0cyU1QiUyMmxhYmVscyUyMiU1RCUyMCUzRCUyMGxhYmVscyU1QiUyMmlucHV0X2lkcyUyMiU1RCUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG1vZGVsX2lucHV0cw==",highlighted:`max_input_length = <span class="hljs-number">128</span>
max_target_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, max_length=max_input_length, truncation=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Thiết lập tokenizer cho nhãn</span>
    <span class="hljs-keyword">with</span> tokenizer.as_target_tokenizer():
        labels = tokenizer(targets, max_length=max_target_length, truncation=<span class="hljs-literal">True</span>)

    model_inputs[<span class="hljs-string">&quot;labels&quot;</span>] = labels[<span class="hljs-string">&quot;input_ids&quot;</span>]
    <span class="hljs-keyword">return</span> model_inputs`,wrap:!1}}),Kn=new ll({props:{$$slots:{default:[rc]},$$scope:{ctx:v}}}),On=new ll({props:{warning:!0,$$slots:{default:[mc]},$$scope:{ctx:v}}}),Nl=new w({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 _a=[uc,yc],Rt=[];function Ga(n,e){return n[0]==="pt"?0:1}Vn=Ga(v),Rn=Rt[Vn]=_a[Vn](v),Al=new xn({props:{title:"Đối chiếu dữ liệu",local:"đối-chiếu-dữ-liệu",headingTag:"h3"}});const Ba=[Tc,Jc],Qt=[];function Va(n,e){return n[0]==="pt"?0:1}Qn=Va(v),Nn=Qt[Qn]=Ba[Qn](v),Yl=new w({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}}),Fl=new w({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}}),ql=new w({props:{code:"YmF0Y2glNUIlMjJsYWJlbHMlMjIlNUQ=",highlighted:'batch[<span class="hljs-string">&quot;labels&quot;</span>]',wrap:!1}}),Dl=new w({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}}),Pl=new w({props:{code:"YmF0Y2glNUIlMjJkZWNvZGVyX2lucHV0X2lkcyUyMiU1RA==",highlighted:'batch[<span class="hljs-string">&quot;decoder_input_ids&quot;</span>]',wrap:!1}}),Kl=new w({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}}),nt=new w({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}}),lt=new w({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 Ra=[gc,dc],Nt=[];function Qa(n,e){return n[0]==="pt"?0:1}Wn=Qa(v),Xn=Nt[Wn]=Ra[Wn](v),tt=new xn({props:{title:"Thước đo",local:"thước-đo",headingTag:"h3"}}),et=new Rs({props:{id:"M05L1DhFqcw"}});let jn=v[0]==="pt"&&Da();ct=new w({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzYWNyZWJsZXU=",highlighted:"!pip install sacrebleu",wrap:!1}}),it=new w({props:{code:"aW1wb3J0JTIwZXZhbHVhdGUlMEElMEFtZXRyaWMlMjAlM0QlMjBldmFsdWF0ZS5sb2FkKCUyMnNhY3JlYmxldSUyMik=",highlighted:`<span class="hljs-keyword">import</span> evaluate

metric = evaluate.load(<span class="hljs-string">&quot;sacrebleu&quot;</span>)`,wrap:!1}}),rt=new w({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}}),mt=new w({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}}),ut=new w({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}}),ot=new w({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}}),Jt=new w({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}}),Tt=new w({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 Na=[bc,Uc],Wt=[];function Wa(n,e){return n[0]==="tf"?0:1}An=Wa(v),zn=Wt[An]=Na[An](v),Ut=new xn({props:{title:"Tinh chỉnh mô hình",local:"tinh-chỉnh-mô-hình",headingTag:"h3"}}),jt=new w({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),kt=new w({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}});const Xa=[wc,jc],Xt=[];function Aa(n,e){return n[0]==="tf"?0:1}En=Aa(v),Hn=Xt[En]=Xa[En](v);let an=v[0]==="pt"&&La();return Ct=new xn({props:{title:"Sử dụng mô hình tinh chỉnh",local:"sử-dụng-mô-hình-tinh-chỉnh",headingTag:"h2"}}),$t=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBJTIzJTIwVGhheSUyMG4lQzMlQjMlMjB2JUUxJUJCJTlCaSUyMGNoZWNrcG9pbnQlMjBjJUUxJUJCJUE3YSUyMGIlRTElQkElQTFuJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRm1hcmlhbi1maW5ldHVuZWQta2RlNC1lbi10by1mciUyMiUwQXRyYW5zbGF0b3IlMjAlM0QlMjBwaXBlbGluZSglMjJ0cmFuc2xhdGlvbiUyMiUyQyUyMG1vZGVsJTNEbW9kZWxfY2hlY2twb2ludCklMEF0cmFuc2xhdG9yKCUyMkRlZmF1bHQlMjB0byUyMGV4cGFuZGVkJTIwdGhyZWFkcyUyMik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

<span class="hljs-comment"># Thay nó với checkpoint của bạn</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}}),vt=new w({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}}),xt=new w({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}}),_t=new w({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}}),nl=new ll({props:{$$slots:{default:[Cc]},$$scope:{ctx:v}}}),Bt=new ac({props:{source:"https://github.com/huggingface/course/blob/main/chapters/vi/chapter7/4.mdx"}}),{c(){c=m("meta"),j=s(),i=m("p"),b=s(),u(I.$$.fragment),g=s(),u(Z.$$.fragment),_=s(),u(B.$$.fragment),$=s(),G.c(),Q=s(),cn=m("p"),cn.innerHTML=O,N=s(),W=m("ul"),W.innerHTML=P,Tn=s(),u(X.$$.fragment),A=s(),z=m("p"),z.innerHTML=K,dn=s(),E=m("p"),E.innerHTML=Y,L=s(),R=m("p"),R.textContent=hn,nn=s(),V=m("iframe"),U=s(),x=m("a"),x.innerHTML=gn,mn=s(),tn=m("p"),tn.innerHTML=vn,wn=s(),u(F.$$.fragment),Yn=s(),yn=m("p"),yn.innerHTML=pn,fn=s(),u(S.$$.fragment),_n=s(),en=m("p"),en.innerHTML=Zn,kn=s(),u(q.$$.fragment),Fn=s(),un=m("p"),un.innerHTML=Mn,Cn=s(),H=m("img"),In=s(),D=m("p"),D.textContent=Sn,on=s(),u(rn.$$.fragment),Gn=s(),u(sn.$$.fragment),Un=s(),Jn=m("p"),Jn.innerHTML=p,C=s(),u(bn.$$.fragment),tl=s(),u(Bn.$$.fragment),h=s(),k=m("p"),k.innerHTML=Hs,Pt=s(),u(el.$$.fragment),Kt=s(),sl=m("p"),sl.textContent=Ys,Ot=s(),u(al.$$.fragment),ne=s(),u(cl.$$.fragment),le=s(),hl=m("p"),hl.textContent=Fs,te=s(),u(il.$$.fragment),ee=s(),u(pl.$$.fragment),se=s(),Ml=m("p"),Ml.textContent=Ss,ae=s(),u(rl.$$.fragment),ce=s(),u(ml.$$.fragment),he=s(),yl=m("p"),yl.textContent=qs,ie=s(),u(ul.$$.fragment),pe=s(),u(ol.$$.fragment),Me=s(),Jl=m("p"),Jl.textContent=Ds,re=s(),u(Tl.$$.fragment),me=s(),u(Ln.$$.fragment),ye=s(),u(dl.$$.fragment),ue=s(),u(gl.$$.fragment),oe=s(),Ul=m("p"),Ul.innerHTML=Ls,Je=s(),u(bl.$$.fragment),Te=s(),jl=m("p"),jl.innerHTML=Ps,de=s(),u(Pn.$$.fragment),ge=s(),wl=m("p"),wl.innerHTML=Ks,Ue=s(),fl=m("p"),fl.innerHTML=Os,be=s(),u(kl.$$.fragment),je=s(),Cl=m("p"),Cl.innerHTML=na,we=s(),Il=m("p"),Il.innerHTML=la,fe=s(),$l=m("p"),$l.textContent=ta,ke=s(),u(vl.$$.fragment),Ce=s(),Zl=m("p"),Zl.textContent=ea,Ie=s(),u(xl.$$.fragment),$e=s(),u(_l.$$.fragment),ve=s(),Gl=m("p"),Gl.textContent=sa,Ze=s(),Bl=m("p"),Bl.innerHTML=aa,xe=s(),u(Vl.$$.fragment),_e=s(),Rl=m("p"),Rl.textContent=ca,Ge=s(),u(Kn.$$.fragment),Be=s(),u(On.$$.fragment),Ve=s(),Ql=m("p"),Ql.textContent=ha,Re=s(),u(Nl.$$.fragment),Qe=s(),Wl=m("p"),Wl.textContent=ia,Ne=s(),Rn.c(),Et=s(),Xl=m("p"),Xl.textContent=pa,We=s(),u(Al.$$.fragment),Xe=s(),zl=m("p"),zl.innerHTML=Ma,Ae=s(),El=m("p"),El.innerHTML=ra,ze=s(),Nn.c(),Ht=s(),Hl=m("p"),Hl.textContent=ma,Ee=s(),u(Yl.$$.fragment),He=s(),u(Fl.$$.fragment),Ye=s(),Sl=m("p"),Sl.innerHTML=ya,Fe=s(),u(ql.$$.fragment),Se=s(),u(Dl.$$.fragment),qe=s(),Ll=m("p"),Ll.textContent=ua,De=s(),u(Pl.$$.fragment),Le=s(),u(Kl.$$.fragment),Pe=s(),Ol=m("p"),Ol.textContent=oa,Ke=s(),u(nt.$$.fragment),Oe=s(),u(lt.$$.fragment),ns=s(),Xn.c(),Yt=s(),u(tt.$$.fragment),ls=s(),u(et.$$.fragment),ts=s(),jn&&jn.c(),Ft=s(),st=m("p"),st.innerHTML=Ja,es=s(),at=m("p"),at.innerHTML=Ta,ss=s(),u(ct.$$.fragment),as=s(),ht=m("p"),ht.innerHTML=da,cs=s(),u(it.$$.fragment),hs=s(),pt=m("p"),pt.textContent=ga,is=s(),Mt=m("p"),Mt.textContent=Ua,ps=s(),u(rt.$$.fragment),Ms=s(),u(mt.$$.fragment),rs=s(),yt=m("p"),yt.innerHTML=ba,ms=s(),u(ut.$$.fragment),ys=s(),u(ot.$$.fragment),us=s(),u(Jt.$$.fragment),os=s(),u(Tt.$$.fragment),Js=s(),dt=m("p"),dt.textContent=ja,Ts=s(),zn.c(),St=s(),gt=m("p"),gt.textContent=wa,ds=s(),u(Ut.$$.fragment),gs=s(),bt=m("p"),bt.textContent=fa,Us=s(),u(jt.$$.fragment),bs=s(),wt=m("p"),wt.textContent=ka,js=s(),ft=m("p"),ft.textContent=Ca,ws=s(),u(kt.$$.fragment),fs=s(),Hn.c(),qt=s(),an&&an.c(),Dt=s(),u(Ct.$$.fragment),ks=s(),It=m("p"),It.innerHTML=Ia,Cs=s(),u($t.$$.fragment),Is=s(),u(vt.$$.fragment),$s=s(),Zt=m("p"),Zt.textContent=$a,vs=s(),u(xt.$$.fragment),Zs=s(),u(_t.$$.fragment),xs=s(),Gt=m("p"),Gt.textContent=va,_s=s(),u(nl.$$.fragment),Gs=s(),u(Bt.$$.fragment),Bs=s(),Lt=m("p"),this.h()},l(n){const e=tc("svelte-u9bgzb",document.head);c=y(e,"META",{name:!0,content:!0}),e.forEach(l),j=a(n),i=y(n,"P",{}),Es(i).forEach(l),b=a(n),o(I.$$.fragment,n),g=a(n),o(Z.$$.fragment,n),_=a(n),o(B.$$.fragment,n),$=a(n),G.l(n),Q=a(n),cn=y(n,"P",{"data-svelte-h":!0}),d(cn)!=="svelte-n1m2s9"&&(cn.innerHTML=O),N=a(n),W=y(n,"UL",{"data-svelte-h":!0}),d(W)!=="svelte-1fd3jnf"&&(W.innerHTML=P),Tn=a(n),o(X.$$.fragment,n),A=a(n),z=y(n,"P",{"data-svelte-h":!0}),d(z)!=="svelte-6l8434"&&(z.innerHTML=K),dn=a(n),E=y(n,"P",{"data-svelte-h":!0}),d(E)!=="svelte-8ua662"&&(E.innerHTML=Y),L=a(n),R=y(n,"P",{"data-svelte-h":!0}),d(R)!=="svelte-nmfn4o"&&(R.textContent=hn),nn=a(n),V=y(n,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),Es(V).forEach(l),U=a(n),x=y(n,"A",{class:!0,href:!0,"data-svelte-h":!0}),d(x)!=="svelte-1ifl6xg"&&(x.innerHTML=gn),mn=a(n),tn=y(n,"P",{"data-svelte-h":!0}),d(tn)!=="svelte-1jr42ed"&&(tn.innerHTML=vn),wn=a(n),o(F.$$.fragment,n),Yn=a(n),yn=y(n,"P",{"data-svelte-h":!0}),d(yn)!=="svelte-kcznsg"&&(yn.innerHTML=pn),fn=a(n),o(S.$$.fragment,n),_n=a(n),en=y(n,"P",{"data-svelte-h":!0}),d(en)!=="svelte-8sa60j"&&(en.innerHTML=Zn),kn=a(n),o(q.$$.fragment,n),Fn=a(n),un=y(n,"P",{"data-svelte-h":!0}),d(un)!=="svelte-rbpyj8"&&(un.innerHTML=Mn),Cn=a(n),H=y(n,"IMG",{src:!0,alt:!0,width:!0}),In=a(n),D=y(n,"P",{"data-svelte-h":!0}),d(D)!=="svelte-19orh71"&&(D.textContent=Sn),on=a(n),o(rn.$$.fragment,n),Gn=a(n),o(sn.$$.fragment,n),Un=a(n),Jn=y(n,"P",{"data-svelte-h":!0}),d(Jn)!=="svelte-1xvp1i4"&&(Jn.innerHTML=p),C=a(n),o(bn.$$.fragment,n),tl=a(n),o(Bn.$$.fragment,n),h=a(n),k=y(n,"P",{"data-svelte-h":!0}),d(k)!=="svelte-n2rga5"&&(k.innerHTML=Hs),Pt=a(n),o(el.$$.fragment,n),Kt=a(n),sl=y(n,"P",{"data-svelte-h":!0}),d(sl)!=="svelte-1d5bfc8"&&(sl.textContent=Ys),Ot=a(n),o(al.$$.fragment,n),ne=a(n),o(cl.$$.fragment,n),le=a(n),hl=y(n,"P",{"data-svelte-h":!0}),d(hl)!=="svelte-pq1aa2"&&(hl.textContent=Fs),te=a(n),o(il.$$.fragment,n),ee=a(n),o(pl.$$.fragment,n),se=a(n),Ml=y(n,"P",{"data-svelte-h":!0}),d(Ml)!=="svelte-h3j9nt"&&(Ml.textContent=Ss),ae=a(n),o(rl.$$.fragment,n),ce=a(n),o(ml.$$.fragment,n),he=a(n),yl=y(n,"P",{"data-svelte-h":!0}),d(yl)!=="svelte-uzxtb4"&&(yl.textContent=qs),ie=a(n),o(ul.$$.fragment,n),pe=a(n),o(ol.$$.fragment,n),Me=a(n),Jl=y(n,"P",{"data-svelte-h":!0}),d(Jl)!=="svelte-3biz2k"&&(Jl.textContent=Ds),re=a(n),o(Tl.$$.fragment,n),me=a(n),o(Ln.$$.fragment,n),ye=a(n),o(dl.$$.fragment,n),ue=a(n),o(gl.$$.fragment,n),oe=a(n),Ul=y(n,"P",{"data-svelte-h":!0}),d(Ul)!=="svelte-165v2ul"&&(Ul.innerHTML=Ls),Je=a(n),o(bl.$$.fragment,n),Te=a(n),jl=y(n,"P",{"data-svelte-h":!0}),d(jl)!=="svelte-1akd2n2"&&(jl.innerHTML=Ps),de=a(n),o(Pn.$$.fragment,n),ge=a(n),wl=y(n,"P",{"data-svelte-h":!0}),d(wl)!=="svelte-yv5vrd"&&(wl.innerHTML=Ks),Ue=a(n),fl=y(n,"P",{"data-svelte-h":!0}),d(fl)!=="svelte-1dnikek"&&(fl.innerHTML=Os),be=a(n),o(kl.$$.fragment,n),je=a(n),Cl=y(n,"P",{"data-svelte-h":!0}),d(Cl)!=="svelte-1tcesqb"&&(Cl.innerHTML=na),we=a(n),Il=y(n,"P",{"data-svelte-h":!0}),d(Il)!=="svelte-l60m93"&&(Il.innerHTML=la),fe=a(n),$l=y(n,"P",{"data-svelte-h":!0}),d($l)!=="svelte-ce39ex"&&($l.textContent=ta),ke=a(n),o(vl.$$.fragment,n),Ce=a(n),Zl=y(n,"P",{"data-svelte-h":!0}),d(Zl)!=="svelte-i0l7xb"&&(Zl.textContent=ea),Ie=a(n),o(xl.$$.fragment,n),$e=a(n),o(_l.$$.fragment,n),ve=a(n),Gl=y(n,"P",{"data-svelte-h":!0}),d(Gl)!=="svelte-n1p1zr"&&(Gl.textContent=sa),Ze=a(n),Bl=y(n,"P",{"data-svelte-h":!0}),d(Bl)!=="svelte-9z9mh7"&&(Bl.innerHTML=aa),xe=a(n),o(Vl.$$.fragment,n),_e=a(n),Rl=y(n,"P",{"data-svelte-h":!0}),d(Rl)!=="svelte-18yll77"&&(Rl.textContent=ca),Ge=a(n),o(Kn.$$.fragment,n),Be=a(n),o(On.$$.fragment,n),Ve=a(n),Ql=y(n,"P",{"data-svelte-h":!0}),d(Ql)!=="svelte-1wsc0yz"&&(Ql.textContent=ha),Re=a(n),o(Nl.$$.fragment,n),Qe=a(n),Wl=y(n,"P",{"data-svelte-h":!0}),d(Wl)!=="svelte-xwsbg3"&&(Wl.textContent=ia),Ne=a(n),Rn.l(n),Et=a(n),Xl=y(n,"P",{"data-svelte-h":!0}),d(Xl)!=="svelte-lyfnwi"&&(Xl.textContent=pa),We=a(n),o(Al.$$.fragment,n),Xe=a(n),zl=y(n,"P",{"data-svelte-h":!0}),d(zl)!=="svelte-1xcpdlw"&&(zl.innerHTML=Ma),Ae=a(n),El=y(n,"P",{"data-svelte-h":!0}),d(El)!=="svelte-1yutq71"&&(El.innerHTML=ra),ze=a(n),Nn.l(n),Ht=a(n),Hl=y(n,"P",{"data-svelte-h":!0}),d(Hl)!=="svelte-tp54x5"&&(Hl.textContent=ma),Ee=a(n),o(Yl.$$.fragment,n),He=a(n),o(Fl.$$.fragment,n),Ye=a(n),Sl=y(n,"P",{"data-svelte-h":!0}),d(Sl)!=="svelte-1lcbrts"&&(Sl.innerHTML=ya),Fe=a(n),o(ql.$$.fragment,n),Se=a(n),o(Dl.$$.fragment,n),qe=a(n),Ll=y(n,"P",{"data-svelte-h":!0}),d(Ll)!=="svelte-1faic4p"&&(Ll.textContent=ua),De=a(n),o(Pl.$$.fragment,n),Le=a(n),o(Kl.$$.fragment,n),Pe=a(n),Ol=y(n,"P",{"data-svelte-h":!0}),d(Ol)!=="svelte-1tianmv"&&(Ol.textContent=oa),Ke=a(n),o(nt.$$.fragment,n),Oe=a(n),o(lt.$$.fragment,n),ns=a(n),Xn.l(n),Yt=a(n),o(tt.$$.fragment,n),ls=a(n),o(et.$$.fragment,n),ts=a(n),jn&&jn.l(n),Ft=a(n),st=y(n,"P",{"data-svelte-h":!0}),d(st)!=="svelte-zxyade"&&(st.innerHTML=Ja),es=a(n),at=y(n,"P",{"data-svelte-h":!0}),d(at)!=="svelte-gvjckf"&&(at.innerHTML=Ta),ss=a(n),o(ct.$$.fragment,n),as=a(n),ht=y(n,"P",{"data-svelte-h":!0}),d(ht)!=="svelte-g2ncrc"&&(ht.innerHTML=da),cs=a(n),o(it.$$.fragment,n),hs=a(n),pt=y(n,"P",{"data-svelte-h":!0}),d(pt)!=="svelte-4s9223"&&(pt.textContent=ga),is=a(n),Mt=y(n,"P",{"data-svelte-h":!0}),d(Mt)!=="svelte-1mw2cak"&&(Mt.textContent=Ua),ps=a(n),o(rt.$$.fragment,n),Ms=a(n),o(mt.$$.fragment,n),rs=a(n),yt=y(n,"P",{"data-svelte-h":!0}),d(yt)!=="svelte-ynfd02"&&(yt.innerHTML=ba),ms=a(n),o(ut.$$.fragment,n),ys=a(n),o(ot.$$.fragment,n),us=a(n),o(Jt.$$.fragment,n),os=a(n),o(Tt.$$.fragment,n),Js=a(n),dt=y(n,"P",{"data-svelte-h":!0}),d(dt)!=="svelte-14v2pes"&&(dt.textContent=ja),Ts=a(n),zn.l(n),St=a(n),gt=y(n,"P",{"data-svelte-h":!0}),d(gt)!=="svelte-18yqr5t"&&(gt.textContent=wa),ds=a(n),o(Ut.$$.fragment,n),gs=a(n),bt=y(n,"P",{"data-svelte-h":!0}),d(bt)!=="svelte-70qsid"&&(bt.textContent=fa),Us=a(n),o(jt.$$.fragment,n),bs=a(n),wt=y(n,"P",{"data-svelte-h":!0}),d(wt)!=="svelte-nqz6ps"&&(wt.textContent=ka),js=a(n),ft=y(n,"P",{"data-svelte-h":!0}),d(ft)!=="svelte-co4ylq"&&(ft.textContent=Ca),ws=a(n),o(kt.$$.fragment,n),fs=a(n),Hn.l(n),qt=a(n),an&&an.l(n),Dt=a(n),o(Ct.$$.fragment,n),ks=a(n),It=y(n,"P",{"data-svelte-h":!0}),d(It)!=="svelte-7jtect"&&(It.innerHTML=Ia),Cs=a(n),o($t.$$.fragment,n),Is=a(n),o(vt.$$.fragment,n),$s=a(n),Zt=y(n,"P",{"data-svelte-h":!0}),d(Zt)!=="svelte-1k5t5jl"&&(Zt.textContent=$a),vs=a(n),o(xt.$$.fragment,n),Zs=a(n),o(_t.$$.fragment,n),xs=a(n),Gt=y(n,"P",{"data-svelte-h":!0}),d(Gt)!=="svelte-1qyll4b"&&(Gt.textContent=va),_s=a(n),o(nl.$$.fragment,n),Gs=a(n),o(Bt.$$.fragment,n),Bs=a(n),Lt=y(n,"P",{}),Es(Lt).forEach(l),this.h()},h(){$n(c,"name","hf:doc:metadata"),$n(c,"content",$c),qa(V.src,ln="https://course-demos-marian-finetuned-kde4-en-to-fr.hf.space")||$n(V,"src",ln),$n(V,"frameborder","0"),$n(V,"height","350"),$n(V,"title","Gradio app"),$n(V,"class","block dark:hidden container p-0 flex-grow space-iframe"),$n(V,"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"),$n(V,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),$n(x,"class","flex justify-center"),$n(x,"href","/huggingface-course/marian-finetuned-kde4-en-to-fr"),qa(H.src,Dn="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/language_tags.png")||$n(H,"src",Dn),$n(H,"alt","Language available for the KDE4 dataset."),$n(H,"width","100%")},m(n,e){ec(document.head,c),t(n,j,e),t(n,i,e),t(n,b,e),J(I,n,e),t(n,g,e),J(Z,n,e),t(n,_,e),J(B,n,e),t(n,$,e),Vt[f].m(n,e),t(n,Q,e),t(n,cn,e),t(n,N,e),t(n,W,e),t(n,Tn,e),J(X,n,e),t(n,A,e),t(n,z,e),t(n,dn,e),t(n,E,e),t(n,L,e),t(n,R,e),t(n,nn,e),t(n,V,e),t(n,U,e),t(n,x,e),t(n,mn,e),t(n,tn,e),t(n,wn,e),J(F,n,e),t(n,Yn,e),t(n,yn,e),t(n,fn,e),J(S,n,e),t(n,_n,e),t(n,en,e),t(n,kn,e),J(q,n,e),t(n,Fn,e),t(n,un,e),t(n,Cn,e),t(n,H,e),t(n,In,e),t(n,D,e),t(n,on,e),J(rn,n,e),t(n,Gn,e),J(sn,n,e),t(n,Un,e),t(n,Jn,e),t(n,C,e),J(bn,n,e),t(n,tl,e),J(Bn,n,e),t(n,h,e),t(n,k,e),t(n,Pt,e),J(el,n,e),t(n,Kt,e),t(n,sl,e),t(n,Ot,e),J(al,n,e),t(n,ne,e),J(cl,n,e),t(n,le,e),t(n,hl,e),t(n,te,e),J(il,n,e),t(n,ee,e),J(pl,n,e),t(n,se,e),t(n,Ml,e),t(n,ae,e),J(rl,n,e),t(n,ce,e),J(ml,n,e),t(n,he,e),t(n,yl,e),t(n,ie,e),J(ul,n,e),t(n,pe,e),J(ol,n,e),t(n,Me,e),t(n,Jl,e),t(n,re,e),J(Tl,n,e),t(n,me,e),J(Ln,n,e),t(n,ye,e),J(dl,n,e),t(n,ue,e),J(gl,n,e),t(n,oe,e),t(n,Ul,e),t(n,Je,e),J(bl,n,e),t(n,Te,e),t(n,jl,e),t(n,de,e),J(Pn,n,e),t(n,ge,e),t(n,wl,e),t(n,Ue,e),t(n,fl,e),t(n,be,e),J(kl,n,e),t(n,je,e),t(n,Cl,e),t(n,we,e),t(n,Il,e),t(n,fe,e),t(n,$l,e),t(n,ke,e),J(vl,n,e),t(n,Ce,e),t(n,Zl,e),t(n,Ie,e),J(xl,n,e),t(n,$e,e),J(_l,n,e),t(n,ve,e),t(n,Gl,e),t(n,Ze,e),t(n,Bl,e),t(n,xe,e),J(Vl,n,e),t(n,_e,e),t(n,Rl,e),t(n,Ge,e),J(Kn,n,e),t(n,Be,e),J(On,n,e),t(n,Ve,e),t(n,Ql,e),t(n,Re,e),J(Nl,n,e),t(n,Qe,e),t(n,Wl,e),t(n,Ne,e),Rt[Vn].m(n,e),t(n,Et,e),t(n,Xl,e),t(n,We,e),J(Al,n,e),t(n,Xe,e),t(n,zl,e),t(n,Ae,e),t(n,El,e),t(n,ze,e),Qt[Qn].m(n,e),t(n,Ht,e),t(n,Hl,e),t(n,Ee,e),J(Yl,n,e),t(n,He,e),J(Fl,n,e),t(n,Ye,e),t(n,Sl,e),t(n,Fe,e),J(ql,n,e),t(n,Se,e),J(Dl,n,e),t(n,qe,e),t(n,Ll,e),t(n,De,e),J(Pl,n,e),t(n,Le,e),J(Kl,n,e),t(n,Pe,e),t(n,Ol,e),t(n,Ke,e),J(nt,n,e),t(n,Oe,e),J(lt,n,e),t(n,ns,e),Nt[Wn].m(n,e),t(n,Yt,e),J(tt,n,e),t(n,ls,e),J(et,n,e),t(n,ts,e),jn&&jn.m(n,e),t(n,Ft,e),t(n,st,e),t(n,es,e),t(n,at,e),t(n,ss,e),J(ct,n,e),t(n,as,e),t(n,ht,e),t(n,cs,e),J(it,n,e),t(n,hs,e),t(n,pt,e),t(n,is,e),t(n,Mt,e),t(n,ps,e),J(rt,n,e),t(n,Ms,e),J(mt,n,e),t(n,rs,e),t(n,yt,e),t(n,ms,e),J(ut,n,e),t(n,ys,e),J(ot,n,e),t(n,us,e),J(Jt,n,e),t(n,os,e),J(Tt,n,e),t(n,Js,e),t(n,dt,e),t(n,Ts,e),Wt[An].m(n,e),t(n,St,e),t(n,gt,e),t(n,ds,e),J(Ut,n,e),t(n,gs,e),t(n,bt,e),t(n,Us,e),J(jt,n,e),t(n,bs,e),t(n,wt,e),t(n,js,e),t(n,ft,e),t(n,ws,e),J(kt,n,e),t(n,fs,e),Xt[En].m(n,e),t(n,qt,e),an&&an.m(n,e),t(n,Dt,e),J(Ct,n,e),t(n,ks,e),t(n,It,e),t(n,Cs,e),J($t,n,e),t(n,Is,e),J(vt,n,e),t(n,$s,e),t(n,Zt,e),t(n,vs,e),J(xt,n,e),t(n,Zs,e),J(_t,n,e),t(n,xs,e),t(n,Gt,e),t(n,_s,e),J(nl,n,e),t(n,Gs,e),J(Bt,n,e),t(n,Bs,e),t(n,Lt,e),Vs=!0},p(n,[e]){const za={};e&1&&(za.fw=n[0]),I.$set(za);let Qs=f;f=xa(n),f!==Qs&&(zt(),r(Vt[Qs],1,1,()=>{Vt[Qs]=null}),At(),G=Vt[f],G||(G=Vt[f]=Za[f](n),G.c()),M(G,1),G.m(Q.parentNode,Q));const Ea={};e&2&&(Ea.$$scope={dirty:e,ctx:n}),Ln.$set(Ea);const Ha={};e&2&&(Ha.$$scope={dirty:e,ctx:n}),Pn.$set(Ha);const Ya={};e&2&&(Ya.$$scope={dirty:e,ctx:n}),Kn.$set(Ya);const Fa={};e&2&&(Fa.$$scope={dirty:e,ctx:n}),On.$set(Fa);let Ns=Vn;Vn=Ga(n),Vn!==Ns&&(zt(),r(Rt[Ns],1,1,()=>{Rt[Ns]=null}),At(),Rn=Rt[Vn],Rn||(Rn=Rt[Vn]=_a[Vn](n),Rn.c()),M(Rn,1),Rn.m(Et.parentNode,Et));let Ws=Qn;Qn=Va(n),Qn!==Ws&&(zt(),r(Qt[Ws],1,1,()=>{Qt[Ws]=null}),At(),Nn=Qt[Qn],Nn||(Nn=Qt[Qn]=Ba[Qn](n),Nn.c()),M(Nn,1),Nn.m(Ht.parentNode,Ht));let Xs=Wn;Wn=Qa(n),Wn!==Xs&&(zt(),r(Nt[Xs],1,1,()=>{Nt[Xs]=null}),At(),Xn=Nt[Wn],Xn||(Xn=Nt[Wn]=Ra[Wn](n),Xn.c()),M(Xn,1),Xn.m(Yt.parentNode,Yt)),n[0]==="pt"?jn||(jn=Da(),jn.c(),jn.m(Ft.parentNode,Ft)):jn&&(jn.d(1),jn=null);let As=An;An=Wa(n),An!==As&&(zt(),r(Wt[As],1,1,()=>{Wt[As]=null}),At(),zn=Wt[An],zn||(zn=Wt[An]=Na[An](n),zn.c()),M(zn,1),zn.m(St.parentNode,St));let zs=En;En=Aa(n),En!==zs&&(zt(),r(Xt[zs],1,1,()=>{Xt[zs]=null}),At(),Hn=Xt[En],Hn||(Hn=Xt[En]=Xa[En](n),Hn.c()),M(Hn,1),Hn.m(qt.parentNode,qt)),n[0]==="pt"?an?e&1&&M(an,1):(an=La(),an.c(),M(an,1),an.m(Dt.parentNode,Dt)):an&&(zt(),r(an,1,1,()=>{an=null}),At());const Sa={};e&2&&(Sa.$$scope={dirty:e,ctx:n}),nl.$set(Sa)},i(n){Vs||(M(I.$$.fragment,n),M(Z.$$.fragment,n),M(B.$$.fragment,n),M(G),M(X.$$.fragment,n),M(F.$$.fragment,n),M(S.$$.fragment,n),M(q.$$.fragment,n),M(rn.$$.fragment,n),M(sn.$$.fragment,n),M(bn.$$.fragment,n),M(Bn.$$.fragment,n),M(el.$$.fragment,n),M(al.$$.fragment,n),M(cl.$$.fragment,n),M(il.$$.fragment,n),M(pl.$$.fragment,n),M(rl.$$.fragment,n),M(ml.$$.fragment,n),M(ul.$$.fragment,n),M(ol.$$.fragment,n),M(Tl.$$.fragment,n),M(Ln.$$.fragment,n),M(dl.$$.fragment,n),M(gl.$$.fragment,n),M(bl.$$.fragment,n),M(Pn.$$.fragment,n),M(kl.$$.fragment,n),M(vl.$$.fragment,n),M(xl.$$.fragment,n),M(_l.$$.fragment,n),M(Vl.$$.fragment,n),M(Kn.$$.fragment,n),M(On.$$.fragment,n),M(Nl.$$.fragment,n),M(Rn),M(Al.$$.fragment,n),M(Nn),M(Yl.$$.fragment,n),M(Fl.$$.fragment,n),M(ql.$$.fragment,n),M(Dl.$$.fragment,n),M(Pl.$$.fragment,n),M(Kl.$$.fragment,n),M(nt.$$.fragment,n),M(lt.$$.fragment,n),M(Xn),M(tt.$$.fragment,n),M(et.$$.fragment,n),M(ct.$$.fragment,n),M(it.$$.fragment,n),M(rt.$$.fragment,n),M(mt.$$.fragment,n),M(ut.$$.fragment,n),M(ot.$$.fragment,n),M(Jt.$$.fragment,n),M(Tt.$$.fragment,n),M(zn),M(Ut.$$.fragment,n),M(jt.$$.fragment,n),M(kt.$$.fragment,n),M(Hn),M(an),M(Ct.$$.fragment,n),M($t.$$.fragment,n),M(vt.$$.fragment,n),M(xt.$$.fragment,n),M(_t.$$.fragment,n),M(nl.$$.fragment,n),M(Bt.$$.fragment,n),Vs=!0)},o(n){r(I.$$.fragment,n),r(Z.$$.fragment,n),r(B.$$.fragment,n),r(G),r(X.$$.fragment,n),r(F.$$.fragment,n),r(S.$$.fragment,n),r(q.$$.fragment,n),r(rn.$$.fragment,n),r(sn.$$.fragment,n),r(bn.$$.fragment,n),r(Bn.$$.fragment,n),r(el.$$.fragment,n),r(al.$$.fragment,n),r(cl.$$.fragment,n),r(il.$$.fragment,n),r(pl.$$.fragment,n),r(rl.$$.fragment,n),r(ml.$$.fragment,n),r(ul.$$.fragment,n),r(ol.$$.fragment,n),r(Tl.$$.fragment,n),r(Ln.$$.fragment,n),r(dl.$$.fragment,n),r(gl.$$.fragment,n),r(bl.$$.fragment,n),r(Pn.$$.fragment,n),r(kl.$$.fragment,n),r(vl.$$.fragment,n),r(xl.$$.fragment,n),r(_l.$$.fragment,n),r(Vl.$$.fragment,n),r(Kn.$$.fragment,n),r(On.$$.fragment,n),r(Nl.$$.fragment,n),r(Rn),r(Al.$$.fragment,n),r(Nn),r(Yl.$$.fragment,n),r(Fl.$$.fragment,n),r(ql.$$.fragment,n),r(Dl.$$.fragment,n),r(Pl.$$.fragment,n),r(Kl.$$.fragment,n),r(nt.$$.fragment,n),r(lt.$$.fragment,n),r(Xn),r(tt.$$.fragment,n),r(et.$$.fragment,n),r(ct.$$.fragment,n),r(it.$$.fragment,n),r(rt.$$.fragment,n),r(mt.$$.fragment,n),r(ut.$$.fragment,n),r(ot.$$.fragment,n),r(Jt.$$.fragment,n),r(Tt.$$.fragment,n),r(zn),r(Ut.$$.fragment,n),r(jt.$$.fragment,n),r(kt.$$.fragment,n),r(Hn),r(an),r(Ct.$$.fragment,n),r($t.$$.fragment,n),r(vt.$$.fragment,n),r(xt.$$.fragment,n),r(_t.$$.fragment,n),r(nl.$$.fragment,n),r(Bt.$$.fragment,n),Vs=!1},d(n){n&&(l(j),l(i),l(b),l(g),l(_),l($),l(Q),l(cn),l(N),l(W),l(Tn),l(A),l(z),l(dn),l(E),l(L),l(R),l(nn),l(V),l(U),l(x),l(mn),l(tn),l(wn),l(Yn),l(yn),l(fn),l(_n),l(en),l(kn),l(Fn),l(un),l(Cn),l(H),l(In),l(D),l(on),l(Gn),l(Un),l(Jn),l(C),l(tl),l(h),l(k),l(Pt),l(Kt),l(sl),l(Ot),l(ne),l(le),l(hl),l(te),l(ee),l(se),l(Ml),l(ae),l(ce),l(he),l(yl),l(ie),l(pe),l(Me),l(Jl),l(re),l(me),l(ye),l(ue),l(oe),l(Ul),l(Je),l(Te),l(jl),l(de),l(ge),l(wl),l(Ue),l(fl),l(be),l(je),l(Cl),l(we),l(Il),l(fe),l($l),l(ke),l(Ce),l(Zl),l(Ie),l($e),l(ve),l(Gl),l(Ze),l(Bl),l(xe),l(_e),l(Rl),l(Ge),l(Be),l(Ve),l(Ql),l(Re),l(Qe),l(Wl),l(Ne),l(Et),l(Xl),l(We),l(Xe),l(zl),l(Ae),l(El),l(ze),l(Ht),l(Hl),l(Ee),l(He),l(Ye),l(Sl),l(Fe),l(Se),l(qe),l(Ll),l(De),l(Le),l(Pe),l(Ol),l(Ke),l(Oe),l(ns),l(Yt),l(ls),l(ts),l(Ft),l(st),l(es),l(at),l(ss),l(as),l(ht),l(cs),l(hs),l(pt),l(is),l(Mt),l(ps),l(Ms),l(rs),l(yt),l(ms),l(ys),l(us),l(os),l(Js),l(dt),l(Ts),l(St),l(gt),l(ds),l(gs),l(bt),l(Us),l(bs),l(wt),l(js),l(ft),l(ws),l(fs),l(qt),l(Dt),l(ks),l(It),l(Cs),l(Is),l($s),l(Zt),l(vs),l(Zs),l(xs),l(Gt),l(_s),l(Gs),l(Bs),l(Lt)),l(c),T(I,n),T(Z,n),T(B,n),Vt[f].d(n),T(X,n),T(F,n),T(S,n),T(q,n),T(rn,n),T(sn,n),T(bn,n),T(Bn,n),T(el,n),T(al,n),T(cl,n),T(il,n),T(pl,n),T(rl,n),T(ml,n),T(ul,n),T(ol,n),T(Tl,n),T(Ln,n),T(dl,n),T(gl,n),T(bl,n),T(Pn,n),T(kl,n),T(vl,n),T(xl,n),T(_l,n),T(Vl,n),T(Kn,n),T(On,n),T(Nl,n),Rt[Vn].d(n),T(Al,n),Qt[Qn].d(n),T(Yl,n),T(Fl,n),T(ql,n),T(Dl,n),T(Pl,n),T(Kl,n),T(nt,n),T(lt,n),Nt[Wn].d(n),T(tt,n),T(et,n),jn&&jn.d(n),T(ct,n),T(it,n),T(rt,n),T(mt,n),T(ut,n),T(ot,n),T(Jt,n),T(Tt,n),Wt[An].d(n),T(Ut,n),T(jt,n),T(kt,n),Xt[En].d(n),an&&an.d(n),T(Ct,n),T($t,n),T(vt,n),T(xt,n),T(_t,n),T(nl,n),T(Bt,n)}}}const $c='{"title":"Dịch máy","local":"dịch-máy","sections":[{"title":"Chuẩn bị dữ liệu","local":"chuẩn-bị-dữ-liệu","sections":[{"title":"Bộ dữ liệu KDE4","local":"bộ-dữ-liệu-kde4","sections":[],"depth":3},{"title":"Chuẩn bị dữ liệu","local":"chuẩn-bị-dữ-liệu","sections":[],"depth":3}],"depth":2},{"title":"Tinh chỉnh mô hình với API Trainer","local":"tinh-chỉnh-mô-hình-với-api-trainer","sections":[],"depth":2},{"title":"Tinh chỉnh mô hình với Keras","local":"tinh-chỉnh-mô-hình-với-keras","sections":[{"title":"Đối chiếu dữ liệu","local":"đối-chiếu-dữ-liệu","sections":[],"depth":3},{"title":"Thước đo","local":"thước-đo","sections":[],"depth":3},{"title":"Tinh chỉnh mô hình","local":"tinh-chỉnh-mô-hình","sections":[],"depth":3}],"depth":2},{"title":"Một vòng huấn luyện tùy chỉnh","local":"một-vòng-huấn-luyện-tùy-chỉnh","sections":[{"title":"Chuẩn bị mọi thứ cho qua trình huấn luyện","local":"chuẩn-bị-mọi-thứ-cho-qua-trình-huấn-luyện","sections":[],"depth":3},{"title":"Vòng lặp huấn luyện","local":"vòng-lặp-huấn-luyện","sections":[],"depth":3}],"depth":2},{"title":"Sử dụng mô hình tinh chỉnh","local":"sử-dụng-mô-hình-tinh-chỉnh","sections":[],"depth":2}],"depth":1}';function vc(v,c,j){let i="pt";return Oa(()=>{const b=new URLSearchParams(window.location.search);j(0,i=b.get("fw")||"pt")}),[i]}class Nc extends nc{constructor(c){super(),lc(this,c,vc,Ic,Ka,{})}}export{Nc as component};
