Por que utilizar o modo offline?
Ao seguir as instruções do autor do código DINO-YOLO para instalar o ambiente e executar o projeto em um servidor, observei que o sistema continuamente tentava se conectar ao site https://huggingface.co/facebook/dinov3-vitb16-pretrain-lvd1689m para baixar o modelo DINOv3. No entanto, meu servidor não conseguia estabelecer conexão com este site, resultando em múltiplas tentativas seguidas por erros.
Portanto, a solução foi baixar completamente o repositório do modelo DINOv3 do Hugging Face localmente, copiar os arquivos para o servidor offline, posicioná-los no diretório de cache do Hugging Face, e então executar o projeto com o transformers em modo offline.
Passos de Implementação e Desafios Encontrados
1. Download Completo do Repositorio do Modelo DINOv3
- Registre-se e faça login no site https://huggingface.co/facebook/dinov3-vitb16-pretrain-lvd1689m
- É necessário preencher um formulário para obter permissão de acesso ao modelo. É recomendável evitar fornecer endereços ou instituições da China ou Rússia, pois isso pode resultar na recusa do pedido.
- Após a aprovação, clique na seção "Arquivos e versões" para baixar todos os arquivos necessários e envie-os para seu servidor.
2. Modificação do Código para Carregamento Local do Modelo DINO
- Organize os modelos no caminho correto, garantindo que o diretório
/data/models/dinov3-vitb16contenha todos os arquivos do repositório baixado. - Antes de iniciar o treinamento, defina as variáveis de ambiente:
export TRANSFORMERS_OFFLINE=1
export HF_HUB_OFFLINE=1
# Opcional: Defina o diretório de cache do HF (se os snapshots estiverem aqui, não é necessário alterar o código)
export HF_HOME=/data/hf_cache
# Se você configurou HUGGINGFACE_HUB_TOKEN, é recomendável removê-lo temporariamente
unset HUGGINGFACE_HUB_TOKEN
- No arquivo
ultralytics/nn/modules/block.py(onde está o código principal de carregamento), altere todas as chamadasfrom_pretrainedpara o modelo DINO para usar o caminho local comlocal_files_only=True.
O script abaixo fará um backup do arquivo original e substituirá chamadas como AutoModel.from_pretrained(...), AutoConfig.from_pretrained(...) e AutoProcessor.from_pretrained(...) (apenas nas chamadas que contenham dinov3 ou dinov3_vitb16). Execute-o no diretório raiz do repositório:
# Execute no diretório raiz do repositório
FILE=ultralytics/nn/modules/block.py
cp "$FILE" "${FILE}.bak" || { echo "Falha no backup, verifique o caminho"; exit 1; }
python3 - <<'PY'
import re,sys,os
p = "ultralytics/nn/modules/block.py"
s = open(p, "r", encoding="utf-8").read()
# Caminho local do modelo (ajuste conforme seu diretório real)
local_path = "/data/models/dinov3-vitb16"
# Substitui chamadas AutoModel.from_pretrained / AutoConfig.from_pretrained / AutoProcessor.from_pretrained
# Apenas quando os parâmetros contiverem dinov3 ou dinov3_vitb16
s = re.sub(r"AutoModel\.from_pretrained\(\s*([^)'\"]*dinov3[^)]*)\)",
f"AutoModel.from_pretrained('{local_path}', local_files_only=True)",
s, flags=re.IGNORECASE)
s = re.sub(r"AutoConfig\.from_pretrained\(\s*([^)'\"]*dinov3[^)]*)\)",
f"AutoConfig.from_pretrained('{local_path}', local_files_only=True)",
s, flags=re.IGNORECASE)
s = re.sub(r"AutoProcessor\.from_pretrained\(\s*([^)'\"]*dinov3[^)]*)\)",
f"AutoProcessor.from_pretrained('{local_path}', local_files_only=True)",
s, flags=re.IGNORECASE)
s = re.sub(r"AutoFeatureExtractor\.from_pretrained\(\s*([^)'\"]*dinov3[^)]*)\)",
f"AutoFeatureExtractor.from_pretrained('{local_path}', local_files_only=True)",
s, flags=re.IGNORECASE)
# Substitui o uso direto de variáveis como modelo_id/dino_id (cobrindo mais casos)
s = s.replace("dino_model_id", f"'{local_path}'")
s = s.replace("hf_model_id", f"'{local_path}'")
open(p, "w", encoding="utf-8").write(s)
print("Arquivo modificado:", p)
PY
Pode ocorrer que outras partes não relacionadas sejam modificadas, causando erros. Nesses casos, analise as mensagens de erro e ajuste manualmente as alterações necessárias.
Após a modificação, o sistema carregará os modelos de /data/models/dinov3-vitb16 em vez de tentar acessar huggingface.co.
Links do Artigo e Código
- Artigo científico: https://arxiv.org/abs/2502.12524
- Código-fonte: https://github.com/Sompote/DINOV3-YOLOV12/tree/main?tab=readme-ov-file