Buckets:
| import{s as Ft,o as Xt,n as pt}from"../chunks/scheduler.b108d059.js";import{S as Nt,i as Ht,g as i,s,r as p,A as Yt,h as r,f as n,c as o,j as qt,u as d,x as c,k as Wt,y as Qt,a as l,v as m,d as M,t as h,w as g}from"../chunks/index.008de539.js";import{T as ut}from"../chunks/Tip.aeb15ab7.js";import{C as w}from"../chunks/CodeBlock.3968c746.js";import{H as he,E as Pt}from"../chunks/EditOnGithub.d1c48e3d.js";function zt(b){let a,J="You can use an existing bucket for storing the fine-tuning artifacts, if you already have a bucket, feel free to skip this step and jump onto the next one.";return{c(){a=i("p"),a.textContent=J},l(u){a=r(u,"P",{"data-svelte-h":!0}),c(a)!=="svelte-16rwlsp"&&(a.textContent=J)},m(u,T){l(u,a,T)},p:pt,d(u){u&&n(a)}}}function Dt(b){let a,J="The <code>CustomContainerTrainingJob</code> will override the default <code>ENTRYPOINT</code> provided within the container URI provided, so if the <code>ENTRYPOINT</code> is already prepared to receive the arguments, then there’s no need to define a custom <code>command</code>.";return{c(){a=i("p"),a.innerHTML=J},l(u){a=r(u,"P",{"data-svelte-h":!0}),c(a)!=="svelte-1puh646"&&(a.innerHTML=J)},m(u,T){l(u,a,T)},p:pt,d(u){u&&n(a)}}}function Ot(b){let a,J=`Once you have decided which resources to use to run the job, you need to define the hyper parameters accordingly to ensure that the selected instance is capable of running the job. | |
| Some of the hparams that you may want to look into to avoid running into OOM errors are the following:`,u,T,j='<li><strong>LoRA / QLoRA</strong>: you may need to tweak the rank, denoted by <code>r</code>, which defines the fraction of trainable parameters for each linear layer included meaning that the lower the less memory consumption.</li> <li><strong>Optimizer</strong>: by default the AdamW optimizer will be used, but alternatively lower precision optimizers can be used to reduce the memory as well e.g. <code>adamw_bnb_8bit</code> (for more information on 8-bit optimizers check <a href="https://huggingface.co/docs/bitsandbytes/main/en/optimizers" rel="nofollow">https://huggingface.co/docs/bitsandbytes/main/en/optimizers</a>).</li> <li><strong>Batch size</strong>: you can tweak this so as to use a lower batch size when running into OOM, or you can also tweak the gradient accumulation steps to simulate a similar batch size for updating the gradients, but providing less inputs within a batch a time e.g. <code>batch_size=8</code> and <code>gradient_accumulation=1</code> is effectively the same as <code>batch_size=4</code> and <code>gradient_accumulation=2</code>.</li>';return{c(){a=i("p"),a.textContent=J,u=s(),T=i("ul"),T.innerHTML=j},l(f){a=r(f,"P",{"data-svelte-h":!0}),c(a)!=="svelte-oq0ay8"&&(a.textContent=J),u=o(f),T=r(f,"UL",{"data-svelte-h":!0}),c(T)!=="svelte-1lf0452"&&(T.innerHTML=j)},m(f,y){l(f,a,y),l(f,u,y),l(f,T,y)},p:pt,d(f){f&&(n(a),n(u),n(T))}}}function Kt(b){let a,J,u,T,j,f,y,dt='<a href="https://github.com/huggingface/trl" rel="nofollow">Transformer Reinforcement Learning (TRL)</a> is a framework developed by Hugging Face to fine-tune and align both transformer language and diffusion models using methods such as Supervised Fine-Tuning (SFT), Reward Modeling (RM), Proximal Policy Optimization (PPO), Direct Preference Optimization (DPO), and others. On the other hand, Vertex AI is a Machine Learning (ML) platform that lets you train and deploy ML models and AI applications, and customize large language models (LLMs) for use in your AI-powered applications.',Te,v,mt="This example showcases how to create a custom training job on Vertex AI running the Hugging Face PyTorch DLC for training, using the TRL CLI to fine-tune a 7B LLM with SFT + LoRA in a single GPU.",fe,$,Je,A,Mt='First, you need to install <code>gcloud</code> in your local machine, which is the command-line tool for Google Cloud, following the instructions at <a href="https://cloud.google.com/sdk/docs/install" rel="nofollow">Cloud SDK Documentation - Install the gcloud CLI</a>.',ye,_,ht="Then, you also need to install the <code>google-cloud-aiplatform</code> Python SDK, required to programmatically create the Vertex AI model, register it, acreate the endpoint, and deploy it on Vertex AI.",we,R,je,L,gt="Optionally, to ease the usage of the commands within this tutorial, you need to set the following environment variables for GCP:",be,x,Ie,E,Tt="Then you need to login into your GCP account and set the project ID to the one you want to use to register and deploy the models on Vertex AI.",Ue,B,Ce,S,ft="Once you are logged in, you need to enable the necessary service APIs in GCP, such as the Vertex AI API, the Compute Engine API, and Google Container Registry related APIs.",ve,k,$e,G,Ae,I,_e,V,Jt="As the Vertex AI job will generate artifacts, you need to specify a Google Cloud Storage (GCS) Bucket to dump those artifacts into. So on, you need to create a GCS Bucket via the <code>gcloud storage buckets create</code> subcommand as follows:",Re,Z,Le,q,xe,W,yt="Once you have configured the environment and created the GCS Bucket (if applicable), you can proceed with the definition of the <code>CustomContainerTrainingJob</code>, which is a standard container job that runs on Vertex AI running a container, being the Hugging Face PyTorch DLC for training.",Ee,F,Be,X,wt="You now need to define a <code>CustomContainerTrainingJob</code> that runs on the Hugging Face PyTorch DLC for training, that needs to set the <code>trl sft</code> command capturing the arguments that will be provided whenever the job runs.",Se,U,ke,N,Ge,H,Ve,Y,jt='Before proceeding to the <code>CustomContainerTrainingJob</code> via the Hugging Face PyTorch DLC for training, you need to define first the configuration required for the job to run successfully i.e. which GPU is capable of fine-tuning <a href="https://huggingface.co/mistralai/Mistral-7B-v0.3" rel="nofollow"><code>mistralai/Mistral-7B-v0.3</code></a> in <code>bfloat16</code> with LoRA adapters.',Ze,Q,bt='As a rough calculation, you could assume that the amount of GPU VRAM required to fine-tune a model in half precision is about four times the model size (read more about it in <a href="https://blog.eleuther.ai/transformer-math/" rel="nofollow">Eleuther AI - Transformer Math 101</a>).',qe,P,It='Alternatively, if your model is uploaded to the Hugging Face Hub, you can check the numbers in the community space <a href="https://huggingface.co/spaces/Vokturz/can-it-run-llm" rel="nofollow"><code>Vokturz/can-it-run-llm</code></a>, which does those calculations for you, based the model to fine-tune and the available hardware.',We,z,Ut='<img src="https://raw.githubusercontent.com/huggingface/Google-Cloud-Containers/main/examples/vertex-ai/notebooks/trl-lora-sft-fine-tuning-on-vertex-ai/assets/can-it-run-llm.png" alt="'Vokturz/can-it-run-llm' for 'mistralai/Mistral-7B-v0.3'"/>',Fe,D,Xe,O,Ct='As mentioned before, the job will run the LoRA Supervised Fine-Tuning (SFT) with the TRL CLI on top of <a href="https://huggingface.co/mistralai/Mistral-7B-v0.3" rel="nofollow"><code>mistralai/Mistral-7B-v0.3</code></a> in <code>bfloat16</code> using <a href="https://huggingface.co/datasets/timdettmers/openassistant-guanaco" rel="nofollow"><code>timdettmers/openassistant-guanaco</code></a>, which is a subset from <a href="https://huggingface.co/datasets/OpenAssistant/oasst1" rel="nofollow"><code>OpenAssistant/oasst1</code></a> with ~10k samples.',Ne,C,He,K,vt='As the <code>CustomContainerTrainingJob</code> defines the command <code>trl sft</code> the arguments to be provided are listed either in the Python reference at <a href="https://huggingface.co/docs/trl/en/sft_trainer#trl.SFTConfig" rel="nofollow">trl.SFTConfig</a> or via the <code>trl sft --help</code> command.',Ye,ee,$t='Read more about the TRL CLI at <a href="https://huggingface.co/docs/trl/en/clis" rel="nofollow">https://huggingface.co/docs/trl/en/clis</a>.',Qe,te,At='It’s important to note that since GCS FUSE is used to mount the bucket as a directory within the running container job, the mounted path follows the formatting <code>/gcs/<BUCKET_NAME></code>. More information at <a href="https://cloud.google.com/vertex-ai/docs/training/code-requirements" rel="nofollow">https://cloud.google.com/vertex-ai/docs/training/code-requirements</a>. So the <code>output_dir</code> needs to be set to the mounted GCS Bucket, meaning that anything the <code>SFTTrainer</code> writes there will be automatically uploaded to the GCS Bucket.',Pe,ne,ze,le,_t="Then you need to call the <code>submit</code> method on the <code>aiplatform.CustomContainerTrainingJob</code>, which is a non-blocking method that will schedule the job without blocking the execution.",De,se,Rt="The arguments provided to the <code>submit</code> method are listed below:",Oe,oe,Lt='<li><p><strong><code>args</code></strong> defines the list of arguments to be provided to the <code>trl sft</code> command, provided as <code>trl sft --arg_1=value ...</code>.</p></li> <li><p><strong><code>replica_count</code></strong> defines the number of replicas to run the job in, for training normally this value will be set to one.</p></li> <li><p><strong><code>machine_type</code></strong>, <strong><code>accelerator_type</code></strong> and <strong><code>accelerator_count</code></strong> define the machine i.e. Compute Engine instance, the accelerator (if any), and the number of accelerators (ranging from 1 to 8); respectively. The <code>machine_type</code> and the <code>accelerator_type</code> are tied together, so you will need to select an instance that supports the accelerator that you are using and vice-versa. More information about the different instances at <a href="https://cloud.google.com/compute/docs/gpus" rel="nofollow">Compute Engine Documentation - GPU machine types</a>, and about the <code>accelerator_type</code> naming at <a href="https://cloud.google.com/vertex-ai/docs/reference/rest/v1/MachineSpec" rel="nofollow">Vertex AI Documentation - MachineSpec</a>.</p></li> <li><p><strong><code>base_output_dir</code></strong> defines the base directory that will be mounted within the running container from the GCS Bucket, conditioned by the <code>staging_bucket</code> argument provided to the <code>aiplatform.init</code> initially.</p></li> <li><p>(optional) <strong><code>environment_variables</code></strong> defines the environment variables to define within the running container. As you are fine-tuning a gated model i.e. <a href="https://huggingface.co/mistralai/Mistral-7B-v0.3" rel="nofollow"><code>mistralai/Mistral-7B-v0.3</code></a>, you need to set the <code>HF_TOKEN</code> environment variable. Additionally, some other environment variables are defined to set the cache path (<code>HF_HOME</code>) and to ensure that the logging messages are streamed to Google Cloud Logs Explorer properly (<code>TRL_USE_RICH</code>, <code>ACCELERATE_LOG_LEVEL</code>, <code>TRANSFORMERS_LOG_LEVEL</code>, and <code>TQDM_POSITION</code>).</p></li> <li><p>(optional) <strong><code>timeout</code></strong> and <strong><code>create_request_timeout</code></strong> define the timeouts in seconds before interrupting the job execution or the job creation request (time to allocate required resources and start the execution), respectively.</p></li>',Ke,ae,et,ie,tt,re,nt,ce,xt='<img src="https://raw.githubusercontent.com/huggingface/Google-Cloud-Containers/main/examples/vertex-ai/notebooks/trl-lora-sft-fine-tuning-on-vertex-ai/assets/vertex-ai-pipeline-scheduled.png" alt="Pipeline created in Vertex AI"/>',lt,ue,Et='<img src="https://raw.githubusercontent.com/huggingface/Google-Cloud-Containers/main/examples/vertex-ai/notebooks/trl-lora-sft-fine-tuning-on-vertex-ai/assets/vertex-ai-pipeline-completed.png" alt="Vertex AI Pipeline successfully completed"/>',st,pe,Bt='<img src="https://raw.githubusercontent.com/huggingface/Google-Cloud-Containers/main/examples/vertex-ai/notebooks/trl-lora-sft-fine-tuning-on-vertex-ai/assets/vertex-ai-pipeline-logs.png" alt="Vertex AI Pipeline logs"/>',ot,de,St='<img src="https://raw.githubusercontent.com/huggingface/Google-Cloud-Containers/main/examples/vertex-ai/notebooks/trl-lora-sft-fine-tuning-on-vertex-ai/assets/gcs-bucket-artifacts.png" alt="GCS Bucket with uploaded artifacts"/>',at,me,kt='Finally, you can upload the fine-tuned model to the Hugging Face Hub, or just keep it within the Google Cloud Storage (GCS) Bucket. Later on, you will be able to run the inference on top of it after <a href="https://huggingface.co/docs/trl/main/en/use_model#use-adapters-peft" rel="nofollow">merging the adapters</a> via either the Hugging Face PyTorch DLC for inference via the <code>pipeline</code> in <code>transformers</code>, or via the Hugging Face DLC for TGI (as the model is fine-tuned for <code>text-generation</code>).',it,Me,rt,ge,ct;return j=new he({props:{title:"Fine-tune Gemma 2B with PyTorch Training DLC using SFT + LoRA on Vertex AI",local:"fine-tune-gemma-2b-with-pytorch-training-dlc-using-sft--lora-on-vertex-ai",headingTag:"h1"}}),$=new he({props:{title:"Setup / Configuration",local:"setup--configuration",headingTag:"h2"}}),R=new w({props:{code:"IXBpcCUyMGluc3RhbGwlMjAtLXVwZ3JhZGUlMjAtLXF1aWV0JTIwZ29vZ2xlLWNsb3VkLWFpcGxhdGZvcm0=",highlighted:"!pip install --upgrade --quiet google-cloud-aiplatform",wrap:!1}}),x=new w({props:{code:"JTI1ZW52JTIwUFJPSkVDVF9JRCUzRHlvdXItcHJvamVjdC1pZCUwQSUyNWVudiUyMExPQ0FUSU9OJTNEeW91ci1sb2NhdGlvbiUwQSUyNWVudiUyMEJVQ0tFVF9VUkklM0RncyUzQSUyRiUyRmhmLXZlcnRleC1waXBlbGluZXMlMEElMjVlbnYlMjBDT05UQUlORVJfVVJJJTNEdXMtZG9ja2VyLnBrZy5kZXYlMkZkZWVwbGVhcm5pbmctcGxhdGZvcm0tcmVsZWFzZSUyRmdjci5pbyUyRmh1Z2dpbmdmYWNlLXB5dG9yY2gtdHJhaW5pbmctY3UxMjEuMi0zLnRyYW5zZm9ybWVycy40LTQyLnVidW50dTIyMDQucHkzMTA=",highlighted:`%env PROJECT_ID=your-project-<span class="hljs-built_in">id</span> | |
| %env LOCATION=your-location | |
| %env BUCKET_URI=gs://hf-vertex-pipelines | |
| %env CONTAINER_URI=us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-pytorch-training-cu121<span class="hljs-number">.2</span>-<span class="hljs-number">3.</span>transformers<span class="hljs-number">.4</span>-<span class="hljs-number">42.</span>ubuntu2204.py310`,wrap:!1}}),B=new w({props:{code:"IWdjbG91ZCUyMGF1dGglMjBsb2dpbiUwQSFnY2xvdWQlMjBhdXRoJTIwYXBwbGljYXRpb24tZGVmYXVsdCUyMGxvZ2luJTIwJTIwJTIzJTIwRm9yJTIwbG9jYWwlMjBkZXZlbG9wbWVudCUwQSFnY2xvdWQlMjBjb25maWclMjBzZXQlMjBwcm9qZWN0JTIwJTI0UFJPSkVDVF9JRA==",highlighted:`!gcloud auth login | |
| !gcloud auth application-default login <span class="hljs-comment"># For local development</span> | |
| !gcloud config <span class="hljs-built_in">set</span> project $PROJECT_ID`,wrap:!1}}),k=new w({props:{code:"IWdjbG91ZCUyMHNlcnZpY2VzJTIwZW5hYmxlJTIwYWlwbGF0Zm9ybS5nb29nbGVhcGlzLmNvbSUwQSFnY2xvdWQlMjBzZXJ2aWNlcyUyMGVuYWJsZSUyMGNvbXB1dGUuZ29vZ2xlYXBpcy5jb20lMEEhZ2Nsb3VkJTIwc2VydmljZXMlMjBlbmFibGUlMjBjb250YWluZXIuZ29vZ2xlYXBpcy5jb20lMEEhZ2Nsb3VkJTIwc2VydmljZXMlMjBlbmFibGUlMjBjb250YWluZXJyZWdpc3RyeS5nb29nbGVhcGlzLmNvbSUwQSFnY2xvdWQlMjBzZXJ2aWNlcyUyMGVuYWJsZSUyMGNvbnRhaW5lcmZpbGVzeXN0ZW0uZ29vZ2xlYXBpcy5jb20=",highlighted:`!gcloud services enable aiplatform.googleapis.com | |
| !gcloud services enable compute.googleapis.com | |
| !gcloud services enable container.googleapis.com | |
| !gcloud services enable containerregistry.googleapis.com | |
| !gcloud services enable containerfilesystem.googleapis.com`,wrap:!1}}),G=new he({props:{title:"Optional: Create bucket in GCS",local:"optional-create-bucket-in-gcs",headingTag:"h2"}}),I=new ut({props:{$$slots:{default:[zt]},$$scope:{ctx:b}}}),Z=new w({props:{code:"IWdjbG91ZCUyMHN0b3JhZ2UlMjBidWNrZXRzJTIwY3JlYXRlJTIwJTI0QlVDS0VUX1VSSSUyMC0tcHJvamVjdCUyMCUyNFBST0pFQ1RfSUQlMjAtLWxvY2F0aW9uJTNEJTI0TE9DQVRJT04lMjAtLWRlZmF1bHQtc3RvcmFnZS1jbGFzcyUzRFNUQU5EQVJEJTIwLS11bmlmb3JtLWJ1Y2tldC1sZXZlbC1hY2Nlc3M=",highlighted:'!gcloud storage buckets create $BUCKET_URI --project $PROJECT_ID --location=$LOCATION --default-storage-<span class="hljs-keyword">class</span>=STANDARD --uniform-bucket-level-access',wrap:!1}}),q=new he({props:{title:"Prepare CustomContainerTrainingJob",local:"prepare-customcontainertrainingjob",headingTag:"h2"}}),F=new w({props:{code:"aW1wb3J0JTIwb3MlMEFmcm9tJTIwZ29vZ2xlLmNsb3VkJTIwaW1wb3J0JTIwYWlwbGF0Zm9ybSUwQSUwQWFpcGxhdGZvcm0uaW5pdCglMEElMjAlMjAlMjAlMjBwcm9qZWN0JTNEb3MuZ2V0ZW52KCUyMlBST0pFQ1RfSUQlMjIpJTJDJTBBJTIwJTIwJTIwJTIwbG9jYXRpb24lM0Rvcy5nZXRlbnYoJTIyTE9DQVRJT04lMjIpJTJDJTBBJTIwJTIwJTIwJTIwc3RhZ2luZ19idWNrZXQlM0Rvcy5nZXRlbnYoJTIyQlVDS0VUX1VSSSUyMiklMkMlMEEp",highlighted:`<span class="hljs-keyword">import</span> os | |
| <span class="hljs-keyword">from</span> google.cloud <span class="hljs-keyword">import</span> aiplatform | |
| aiplatform.init( | |
| project=os.getenv(<span class="hljs-string">"PROJECT_ID"</span>), | |
| location=os.getenv(<span class="hljs-string">"LOCATION"</span>), | |
| staging_bucket=os.getenv(<span class="hljs-string">"BUCKET_URI"</span>), | |
| )`,wrap:!1}}),U=new ut({props:{$$slots:{default:[Dt]},$$scope:{ctx:b}}}),N=new w({props:{code:"am9iJTIwJTNEJTIwYWlwbGF0Zm9ybS5DdXN0b21Db250YWluZXJUcmFpbmluZ0pvYiglMEElMjAlMjAlMjAlMjBkaXNwbGF5X25hbWUlM0QlMjJ0cmwtbG9yYS1zZnQlMjIlMkMlMEElMjAlMjAlMjAlMjBjb250YWluZXJfdXJpJTNEb3MuZ2V0ZW52KCUyMkNPTlRBSU5FUl9VUkklMjIpJTJDJTBBJTIwJTIwJTIwJTIwY29tbWFuZCUzRCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnNoJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyLWMlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAnZXhlYyUyMHRybCUyMHNmdCUyMCUyMiUyNCU0MCUyMiclMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjItLSUyMiUyQyUwQSUyMCUyMCUyMCUyMCU1RCUyQyUwQSk=",highlighted:`job = aiplatform.CustomContainerTrainingJob( | |
| display_name=<span class="hljs-string">"trl-lora-sft"</span>, | |
| container_uri=os.getenv(<span class="hljs-string">"CONTAINER_URI"</span>), | |
| command=[ | |
| <span class="hljs-string">"sh"</span>, | |
| <span class="hljs-string">"-c"</span>, | |
| <span class="hljs-string">'exec trl sft "$@"'</span>, | |
| <span class="hljs-string">"--"</span>, | |
| ], | |
| )`,wrap:!1}}),H=new he({props:{title:"Define CustomContainerTrainingJob Requirements",local:"define-customcontainertrainingjob-requirements",headingTag:"h2"}}),D=new he({props:{title:"Run CustomContainerTrainingJob",local:"run-customcontainertrainingjob",headingTag:"h2"}}),C=new ut({props:{$$slots:{default:[Ot]},$$scope:{ctx:b}}}),ne=new w({props:{code:"YXJncyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMyUyME1PREVMJTBBJTIwJTIwJTIwJTIwJTIyLS1tb2RlbF9uYW1lX29yX3BhdGglM0RtaXN0cmFsYWklMkZNaXN0cmFsLTdCLXYwLjMlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLXRvcmNoX2R0eXBlJTNEYmZsb2F0MTYlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWF0dG5faW1wbGVtZW50YXRpb24lM0RmbGFzaF9hdHRlbnRpb25fMiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMyUyMERBVEFTRVQlMEElMjAlMjAlMjAlMjAlMjItLWRhdGFzZXRfbmFtZSUzRHRpbWRldHRtZXJzJTJGb3BlbmFzc2lzdGFudC1ndWFuYWNvJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1kYXRhc2V0X3RleHRfZmllbGQlM0R0ZXh0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIzJTIwUEVGVCUwQSUyMCUyMCUyMCUyMCUyMi0tdXNlX3BlZnQlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWxvcmFfciUzRDE2JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1sb3JhX2FscGhhJTNEMzIlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWxvcmFfZHJvcG91dCUzRDAuMSUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMi0tbG9yYV90YXJnZXRfbW9kdWxlcyUzRGFsbC1saW5lYXIlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjMlMjBUUkFJTkVSJTBBJTIwJTIwJTIwJTIwJTIyLS1iZjE2JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1tYXhfc2VxX2xlbmd0aCUzRDEwMjQlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLXBlcl9kZXZpY2VfdHJhaW5fYmF0Y2hfc2l6ZSUzRDIlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWdyYWRpZW50X2FjY3VtdWxhdGlvbl9zdGVwcyUzRDglMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWdyYWRpZW50X2NoZWNrcG9pbnRpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWxlYXJuaW5nX3JhdGUlM0QwLjAwMDIlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjItLWxyX3NjaGVkdWxlcl90eXBlJTNEY29zaW5lJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1vcHRpbSUzRGFkYW13X2JuYl84Yml0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1udW1fdHJhaW5fZXBvY2hzJTNEMSUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMi0tbG9nZ2luZ19zdGVwcyUzRDEwJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1kb19ldmFsJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1ldmFsX3N0ZXBzJTNEMTAwJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1yZXBvcnRfdG8lM0Rub25lJTIyJTJDJTBBJTIwJTIwJTIwJTIwZiUyMi0tb3V0cHV0X2RpciUzRCU3Qm9zLmdldGVudignQlVDS0VUX1VSSScpLnJlcGxhY2UoJ2dzJTNBJTJGJTJGJyUyQyUyMCclMkZnY3MlMkYnKSU3RCUyRk1pc3RyYWwtN0ItdjAuMy1Mb1JBLVNGVC1HdWFuYWNvJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1vdmVyd3JpdGVfb3V0cHV0X2RpciUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMi0tc2VlZCUzRDQyJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyLS1sb2dfbGV2ZWwlM0RkZWJ1ZyUyMiUyQyUwQSU1RA==",highlighted:`args = [ | |
| <span class="hljs-comment"># MODEL</span> | |
| <span class="hljs-string">"--model_name_or_path=mistralai/Mistral-7B-v0.3"</span>, | |
| <span class="hljs-string">"--torch_dtype=bfloat16"</span>, | |
| <span class="hljs-string">"--attn_implementation=flash_attention_2"</span>, | |
| <span class="hljs-comment"># DATASET</span> | |
| <span class="hljs-string">"--dataset_name=timdettmers/openassistant-guanaco"</span>, | |
| <span class="hljs-string">"--dataset_text_field=text"</span>, | |
| <span class="hljs-comment"># PEFT</span> | |
| <span class="hljs-string">"--use_peft"</span>, | |
| <span class="hljs-string">"--lora_r=16"</span>, | |
| <span class="hljs-string">"--lora_alpha=32"</span>, | |
| <span class="hljs-string">"--lora_dropout=0.1"</span>, | |
| <span class="hljs-string">"--lora_target_modules=all-linear"</span>, | |
| <span class="hljs-comment"># TRAINER</span> | |
| <span class="hljs-string">"--bf16"</span>, | |
| <span class="hljs-string">"--max_seq_length=1024"</span>, | |
| <span class="hljs-string">"--per_device_train_batch_size=2"</span>, | |
| <span class="hljs-string">"--gradient_accumulation_steps=8"</span>, | |
| <span class="hljs-string">"--gradient_checkpointing"</span>, | |
| <span class="hljs-string">"--learning_rate=0.0002"</span>, | |
| <span class="hljs-string">"--lr_scheduler_type=cosine"</span>, | |
| <span class="hljs-string">"--optim=adamw_bnb_8bit"</span>, | |
| <span class="hljs-string">"--num_train_epochs=1"</span>, | |
| <span class="hljs-string">"--logging_steps=10"</span>, | |
| <span class="hljs-string">"--do_eval"</span>, | |
| <span class="hljs-string">"--eval_steps=100"</span>, | |
| <span class="hljs-string">"--report_to=none"</span>, | |
| <span class="hljs-string">f"--output_dir=<span class="hljs-subst">{os.getenv(<span class="hljs-string">'BUCKET_URI'</span>).replace(<span class="hljs-string">'gs://'</span>, <span class="hljs-string">'/gcs/'</span>)}</span>/Mistral-7B-v0.3-LoRA-SFT-Guanaco"</span>, | |
| <span class="hljs-string">"--overwrite_output_dir"</span>, | |
| <span class="hljs-string">"--seed=42"</span>, | |
| <span class="hljs-string">"--log_level=debug"</span>, | |
| ]`,wrap:!1}}),ae=new w({props:{code:"IXBpcCUyMGluc3RhbGwlMjAtLXVwZ3JhZGUlMjAtLXF1aWV0JTIwaHVnZ2luZ2ZhY2VfaHVi",highlighted:"!pip install --upgrade --quiet huggingface_hub",wrap:!1}}),ie=new w({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMGludGVycHJldGVyX2xvZ2luJTBBJTBBaW50ZXJwcmV0ZXJfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> interpreter_login | |
| interpreter_login()`,wrap:!1}}),re=new w({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMGdldF90b2tlbiUwQSUwQWpvYi5zdWJtaXQoJTBBJTIwJTIwJTIwJTIwYXJncyUzRGFyZ3MlMkMlMEElMjAlMjAlMjAlMjByZXBsaWNhX2NvdW50JTNEMSUyQyUwQSUyMCUyMCUyMCUyMG1hY2hpbmVfdHlwZSUzRCUyMmcyLXN0YW5kYXJkLTEyJTIyJTJDJTBBJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3JfdHlwZSUzRCUyMk5WSURJQV9MNCUyMiUyQyUwQSUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yX2NvdW50JTNEMSUyQyUwQSUyMCUyMCUyMCUyMGJhc2Vfb3V0cHV0X2RpciUzRGYlMjIlN0Jvcy5nZXRlbnYoJ0JVQ0tFVF9VUkknKSU3RCUyRk1pc3RyYWwtN0ItdjAuMy1Mb1JBLVNGVC1HdWFuYWNvJTIyJTJDJTBBJTIwJTIwJTIwJTIwZW52aXJvbm1lbnRfdmFyaWFibGVzJTNEJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIySEZfSE9NRSUyMiUzQSUyMCUyMiUyRnJvb3QlMkYuY2FjaGUlMkZodWdnaW5nZmFjZSUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMkhGX1RPS0VOJTIyJTNBJTIwZ2V0X3Rva2VuKCklMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJUUkxfVVNFX1JJQ0glMjIlM0ElMjAlMjIwJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyQUNDRUxFUkFURV9MT0dfTEVWRUwlMjIlM0ElMjAlMjJJTkZPJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyVFJBTlNGT1JNRVJTX0xPR19MRVZFTCUyMiUzQSUyMCUyMklORk8lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJUUURNX1BPU0lUSU9OJTIyJTNBJTIwJTIyLTElMjIlMkMlMEElMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjB0aW1lb3V0JTNENjAlMjAqJTIwNjAlMjAqJTIwMyUyQyUyMCUyMCUyMyUyMDMlMjBob3VycyUyMCgxMDgwMHMpJTBBJTIwJTIwJTIwJTIwY3JlYXRlX3JlcXVlc3RfdGltZW91dCUzRDYwJTIwKiUyMDEwJTJDJTIwJTIwJTIzJTIwMTAlMjBtaW51dGVzJTIwKDYwMHMpJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> get_token | |
| job.submit( | |
| args=args, | |
| replica_count=<span class="hljs-number">1</span>, | |
| machine_type=<span class="hljs-string">"g2-standard-12"</span>, | |
| accelerator_type=<span class="hljs-string">"NVIDIA_L4"</span>, | |
| accelerator_count=<span class="hljs-number">1</span>, | |
| base_output_dir=<span class="hljs-string">f"<span class="hljs-subst">{os.getenv(<span class="hljs-string">'BUCKET_URI'</span>)}</span>/Mistral-7B-v0.3-LoRA-SFT-Guanaco"</span>, | |
| environment_variables={ | |
| <span class="hljs-string">"HF_HOME"</span>: <span class="hljs-string">"/root/.cache/huggingface"</span>, | |
| <span class="hljs-string">"HF_TOKEN"</span>: get_token(), | |
| <span class="hljs-string">"TRL_USE_RICH"</span>: <span class="hljs-string">"0"</span>, | |
| <span class="hljs-string">"ACCELERATE_LOG_LEVEL"</span>: <span class="hljs-string">"INFO"</span>, | |
| <span class="hljs-string">"TRANSFORMERS_LOG_LEVEL"</span>: <span class="hljs-string">"INFO"</span>, | |
| <span class="hljs-string">"TQDM_POSITION"</span>: <span class="hljs-string">"-1"</span>, | |
| }, | |
| timeout=<span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">3</span>, <span class="hljs-comment"># 3 hours (10800s)</span> | |
| create_request_timeout=<span class="hljs-number">60</span> * <span class="hljs-number">10</span>, <span class="hljs-comment"># 10 minutes (600s)</span> | |
| )`,wrap:!1}}),Me=new Pt({props:{source:"https://github.com/huggingface/Google-Cloud-Containers/blob/main/docs/source/examples/vertex-ai-notebooks-trl-lora-sft-fine-tuning-on-vertex-ai.mdx"}}),{c(){a=i("meta"),J=s(),u=i("p"),T=s(),p(j.$$.fragment),f=s(),y=i("p"),y.innerHTML=dt,Te=s(),v=i("p"),v.textContent=mt,fe=s(),p($.$$.fragment),Je=s(),A=i("p"),A.innerHTML=Mt,ye=s(),_=i("p"),_.innerHTML=ht,we=s(),p(R.$$.fragment),je=s(),L=i("p"),L.textContent=gt,be=s(),p(x.$$.fragment),Ie=s(),E=i("p"),E.textContent=Tt,Ue=s(),p(B.$$.fragment),Ce=s(),S=i("p"),S.textContent=ft,ve=s(),p(k.$$.fragment),$e=s(),p(G.$$.fragment),Ae=s(),p(I.$$.fragment),_e=s(),V=i("p"),V.innerHTML=Jt,Re=s(),p(Z.$$.fragment),Le=s(),p(q.$$.fragment),xe=s(),W=i("p"),W.innerHTML=yt,Ee=s(),p(F.$$.fragment),Be=s(),X=i("p"),X.innerHTML=wt,Se=s(),p(U.$$.fragment),ke=s(),p(N.$$.fragment),Ge=s(),p(H.$$.fragment),Ve=s(),Y=i("p"),Y.innerHTML=jt,Ze=s(),Q=i("p"),Q.innerHTML=bt,qe=s(),P=i("p"),P.innerHTML=It,We=s(),z=i("p"),z.innerHTML=Ut,Fe=s(),p(D.$$.fragment),Xe=s(),O=i("p"),O.innerHTML=Ct,Ne=s(),p(C.$$.fragment),He=s(),K=i("p"),K.innerHTML=vt,Ye=s(),ee=i("p"),ee.innerHTML=$t,Qe=s(),te=i("p"),te.innerHTML=At,Pe=s(),p(ne.$$.fragment),ze=s(),le=i("p"),le.innerHTML=_t,De=s(),se=i("p"),se.innerHTML=Rt,Oe=s(),oe=i("ul"),oe.innerHTML=Lt,Ke=s(),p(ae.$$.fragment),et=s(),p(ie.$$.fragment),tt=s(),p(re.$$.fragment),nt=s(),ce=i("p"),ce.innerHTML=xt,lt=s(),ue=i("p"),ue.innerHTML=Et,st=s(),pe=i("p"),pe.innerHTML=Bt,ot=s(),de=i("p"),de.innerHTML=St,at=s(),me=i("p"),me.innerHTML=kt,it=s(),p(Me.$$.fragment),rt=s(),ge=i("p"),this.h()},l(e){const t=Yt("svelte-u9bgzb",document.head);a=r(t,"META",{name:!0,content:!0}),t.forEach(n),J=o(e),u=r(e,"P",{}),qt(u).forEach(n),T=o(e),d(j.$$.fragment,e),f=o(e),y=r(e,"P",{"data-svelte-h":!0}),c(y)!=="svelte-1r6b2zf"&&(y.innerHTML=dt),Te=o(e),v=r(e,"P",{"data-svelte-h":!0}),c(v)!=="svelte-inbnn8"&&(v.textContent=mt),fe=o(e),d($.$$.fragment,e),Je=o(e),A=r(e,"P",{"data-svelte-h":!0}),c(A)!=="svelte-1o67gfb"&&(A.innerHTML=Mt),ye=o(e),_=r(e,"P",{"data-svelte-h":!0}),c(_)!=="svelte-1ebrquh"&&(_.innerHTML=ht),we=o(e),d(R.$$.fragment,e),je=o(e),L=r(e,"P",{"data-svelte-h":!0}),c(L)!=="svelte-1i8n6rq"&&(L.textContent=gt),be=o(e),d(x.$$.fragment,e),Ie=o(e),E=r(e,"P",{"data-svelte-h":!0}),c(E)!=="svelte-15nvzfz"&&(E.textContent=Tt),Ue=o(e),d(B.$$.fragment,e),Ce=o(e),S=r(e,"P",{"data-svelte-h":!0}),c(S)!=="svelte-1nm8o2l"&&(S.textContent=ft),ve=o(e),d(k.$$.fragment,e),$e=o(e),d(G.$$.fragment,e),Ae=o(e),d(I.$$.fragment,e),_e=o(e),V=r(e,"P",{"data-svelte-h":!0}),c(V)!=="svelte-48jxyw"&&(V.innerHTML=Jt),Re=o(e),d(Z.$$.fragment,e),Le=o(e),d(q.$$.fragment,e),xe=o(e),W=r(e,"P",{"data-svelte-h":!0}),c(W)!=="svelte-169vc8o"&&(W.innerHTML=yt),Ee=o(e),d(F.$$.fragment,e),Be=o(e),X=r(e,"P",{"data-svelte-h":!0}),c(X)!=="svelte-1hb0nvg"&&(X.innerHTML=wt),Se=o(e),d(U.$$.fragment,e),ke=o(e),d(N.$$.fragment,e),Ge=o(e),d(H.$$.fragment,e),Ve=o(e),Y=r(e,"P",{"data-svelte-h":!0}),c(Y)!=="svelte-1rqb4bn"&&(Y.innerHTML=jt),Ze=o(e),Q=r(e,"P",{"data-svelte-h":!0}),c(Q)!=="svelte-gy0104"&&(Q.innerHTML=bt),qe=o(e),P=r(e,"P",{"data-svelte-h":!0}),c(P)!=="svelte-1qv2h88"&&(P.innerHTML=It),We=o(e),z=r(e,"P",{"data-svelte-h":!0}),c(z)!=="svelte-o8obxb"&&(z.innerHTML=Ut),Fe=o(e),d(D.$$.fragment,e),Xe=o(e),O=r(e,"P",{"data-svelte-h":!0}),c(O)!=="svelte-1a7nnjo"&&(O.innerHTML=Ct),Ne=o(e),d(C.$$.fragment,e),He=o(e),K=r(e,"P",{"data-svelte-h":!0}),c(K)!=="svelte-1h96pqn"&&(K.innerHTML=vt),Ye=o(e),ee=r(e,"P",{"data-svelte-h":!0}),c(ee)!=="svelte-1u6w4tj"&&(ee.innerHTML=$t),Qe=o(e),te=r(e,"P",{"data-svelte-h":!0}),c(te)!=="svelte-1s7zwy8"&&(te.innerHTML=At),Pe=o(e),d(ne.$$.fragment,e),ze=o(e),le=r(e,"P",{"data-svelte-h":!0}),c(le)!=="svelte-1dy7udt"&&(le.innerHTML=_t),De=o(e),se=r(e,"P",{"data-svelte-h":!0}),c(se)!=="svelte-c8lo6u"&&(se.innerHTML=Rt),Oe=o(e),oe=r(e,"UL",{"data-svelte-h":!0}),c(oe)!=="svelte-2jgcyb"&&(oe.innerHTML=Lt),Ke=o(e),d(ae.$$.fragment,e),et=o(e),d(ie.$$.fragment,e),tt=o(e),d(re.$$.fragment,e),nt=o(e),ce=r(e,"P",{"data-svelte-h":!0}),c(ce)!=="svelte-f1y78y"&&(ce.innerHTML=xt),lt=o(e),ue=r(e,"P",{"data-svelte-h":!0}),c(ue)!=="svelte-1s1iqv7"&&(ue.innerHTML=Et),st=o(e),pe=r(e,"P",{"data-svelte-h":!0}),c(pe)!=="svelte-dhsoks"&&(pe.innerHTML=Bt),ot=o(e),de=r(e,"P",{"data-svelte-h":!0}),c(de)!=="svelte-yuwmcb"&&(de.innerHTML=St),at=o(e),me=r(e,"P",{"data-svelte-h":!0}),c(me)!=="svelte-1uovfna"&&(me.innerHTML=kt),it=o(e),d(Me.$$.fragment,e),rt=o(e),ge=r(e,"P",{}),qt(ge).forEach(n),this.h()},h(){Wt(a,"name","hf:doc:metadata"),Wt(a,"content",en)},m(e,t){Qt(document.head,a),l(e,J,t),l(e,u,t),l(e,T,t),m(j,e,t),l(e,f,t),l(e,y,t),l(e,Te,t),l(e,v,t),l(e,fe,t),m($,e,t),l(e,Je,t),l(e,A,t),l(e,ye,t),l(e,_,t),l(e,we,t),m(R,e,t),l(e,je,t),l(e,L,t),l(e,be,t),m(x,e,t),l(e,Ie,t),l(e,E,t),l(e,Ue,t),m(B,e,t),l(e,Ce,t),l(e,S,t),l(e,ve,t),m(k,e,t),l(e,$e,t),m(G,e,t),l(e,Ae,t),m(I,e,t),l(e,_e,t),l(e,V,t),l(e,Re,t),m(Z,e,t),l(e,Le,t),m(q,e,t),l(e,xe,t),l(e,W,t),l(e,Ee,t),m(F,e,t),l(e,Be,t),l(e,X,t),l(e,Se,t),m(U,e,t),l(e,ke,t),m(N,e,t),l(e,Ge,t),m(H,e,t),l(e,Ve,t),l(e,Y,t),l(e,Ze,t),l(e,Q,t),l(e,qe,t),l(e,P,t),l(e,We,t),l(e,z,t),l(e,Fe,t),m(D,e,t),l(e,Xe,t),l(e,O,t),l(e,Ne,t),m(C,e,t),l(e,He,t),l(e,K,t),l(e,Ye,t),l(e,ee,t),l(e,Qe,t),l(e,te,t),l(e,Pe,t),m(ne,e,t),l(e,ze,t),l(e,le,t),l(e,De,t),l(e,se,t),l(e,Oe,t),l(e,oe,t),l(e,Ke,t),m(ae,e,t),l(e,et,t),m(ie,e,t),l(e,tt,t),m(re,e,t),l(e,nt,t),l(e,ce,t),l(e,lt,t),l(e,ue,t),l(e,st,t),l(e,pe,t),l(e,ot,t),l(e,de,t),l(e,at,t),l(e,me,t),l(e,it,t),m(Me,e,t),l(e,rt,t),l(e,ge,t),ct=!0},p(e,[t]){const Gt={};t&2&&(Gt.$$scope={dirty:t,ctx:e}),I.$set(Gt);const Vt={};t&2&&(Vt.$$scope={dirty:t,ctx:e}),U.$set(Vt);const Zt={};t&2&&(Zt.$$scope={dirty:t,ctx:e}),C.$set(Zt)},i(e){ct||(M(j.$$.fragment,e),M($.$$.fragment,e),M(R.$$.fragment,e),M(x.$$.fragment,e),M(B.$$.fragment,e),M(k.$$.fragment,e),M(G.$$.fragment,e),M(I.$$.fragment,e),M(Z.$$.fragment,e),M(q.$$.fragment,e),M(F.$$.fragment,e),M(U.$$.fragment,e),M(N.$$.fragment,e),M(H.$$.fragment,e),M(D.$$.fragment,e),M(C.$$.fragment,e),M(ne.$$.fragment,e),M(ae.$$.fragment,e),M(ie.$$.fragment,e),M(re.$$.fragment,e),M(Me.$$.fragment,e),ct=!0)},o(e){h(j.$$.fragment,e),h($.$$.fragment,e),h(R.$$.fragment,e),h(x.$$.fragment,e),h(B.$$.fragment,e),h(k.$$.fragment,e),h(G.$$.fragment,e),h(I.$$.fragment,e),h(Z.$$.fragment,e),h(q.$$.fragment,e),h(F.$$.fragment,e),h(U.$$.fragment,e),h(N.$$.fragment,e),h(H.$$.fragment,e),h(D.$$.fragment,e),h(C.$$.fragment,e),h(ne.$$.fragment,e),h(ae.$$.fragment,e),h(ie.$$.fragment,e),h(re.$$.fragment,e),h(Me.$$.fragment,e),ct=!1},d(e){e&&(n(J),n(u),n(T),n(f),n(y),n(Te),n(v),n(fe),n(Je),n(A),n(ye),n(_),n(we),n(je),n(L),n(be),n(Ie),n(E),n(Ue),n(Ce),n(S),n(ve),n($e),n(Ae),n(_e),n(V),n(Re),n(Le),n(xe),n(W),n(Ee),n(Be),n(X),n(Se),n(ke),n(Ge),n(Ve),n(Y),n(Ze),n(Q),n(qe),n(P),n(We),n(z),n(Fe),n(Xe),n(O),n(Ne),n(He),n(K),n(Ye),n(ee),n(Qe),n(te),n(Pe),n(ze),n(le),n(De),n(se),n(Oe),n(oe),n(Ke),n(et),n(tt),n(nt),n(ce),n(lt),n(ue),n(st),n(pe),n(ot),n(de),n(at),n(me),n(it),n(rt),n(ge)),n(a),g(j,e),g($,e),g(R,e),g(x,e),g(B,e),g(k,e),g(G,e),g(I,e),g(Z,e),g(q,e),g(F,e),g(U,e),g(N,e),g(H,e),g(D,e),g(C,e),g(ne,e),g(ae,e),g(ie,e),g(re,e),g(Me,e)}}}const en='{"title":"Fine-tune Gemma 2B with PyTorch Training DLC using SFT + LoRA on Vertex AI","local":"fine-tune-gemma-2b-with-pytorch-training-dlc-using-sft--lora-on-vertex-ai","sections":[{"title":"Setup / Configuration","local":"setup--configuration","sections":[],"depth":2},{"title":"Optional: Create bucket in GCS","local":"optional-create-bucket-in-gcs","sections":[],"depth":2},{"title":"Prepare CustomContainerTrainingJob","local":"prepare-customcontainertrainingjob","sections":[],"depth":2},{"title":"Define CustomContainerTrainingJob Requirements","local":"define-customcontainertrainingjob-requirements","sections":[],"depth":2},{"title":"Run CustomContainerTrainingJob","local":"run-customcontainertrainingjob","sections":[],"depth":2}],"depth":1}';function tn(b){return Xt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class rn extends Nt{constructor(a){super(),Ht(this,a,tn,Kt,Ft,{})}}export{rn as component}; | |
Xet Storage Details
- Size:
- 34.5 kB
- Xet hash:
- 5248c353a912a083389b334bd6b018ba17d5c32205850584c56ad378e06eb695
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.