Weblog Posit AI: tocha 0.11.0



Weblog Posit AI: tocha 0.11.0

torch v0.11.0 agora está no CRAN! Esta postagem do weblog destaca algumas das mudanças incluídas nesta versão. Mas você sempre pode encontrar o completo registro de alterações
no web site da tocha.

Carregamento aprimorado de dicionários de estado

Por muito tempo foi possível usar o torch do R para carregar dicionários de estado (ou seja, pesos de modelo) treinados com PyTorch usando o load_state_dict() função. No entanto, period comum obter o erro:

Error in cpp_load_state_dict(path) :  isGenericDict() INTERNAL ASSERT FAILED at

Isso aconteceu porque ao salvar o state_dict do Python, não period realmente um dicionário, mas um ordenado dicionário. Pesos no PyTorch são serializados como Salmoura arquivos – um formato específico do Python semelhante ao nosso RDS. Para carregá-los em C++, sem um tempo de execução do Python, o LibTorch implementa um leitor de pickle que é capaz de ler apenas um subconjunto do formato do arquivo, e esse subconjunto não incluía dicts ordenados.

Esta versão adiciona suporte para leitura de dicionários ordenados, então você não verá mais esse erro.

Além disso, a leitura desses arquivos requer metade do pico de uso de memória e, consequentemente, também é muito mais rápida. Aqui estão os tempos para ler um modelo de parâmetro 3B (StableLM-3B) com v0.10.0:

system.time({
  x <- torch::load_state_dict("~/Downloads/pytorch_model-00001-of-00002.bin")
  y <- torch::load_state_dict("~/Downloads/pytorch_model-00002-of-00002.bin")
})
   person  system elapsed 
662.300  26.859 713.484 

e com v0.11.0

   person  system elapsed 
  0.022   3.016   4.016 

O que significa que passamos de minutos para apenas alguns segundos.

Usando operações JIT

Uma das maneiras mais comuns de estender o LibTorch/PyTorch é implementando operações JIT. Isso permite que os desenvolvedores escrevam código personalizado e otimizado em C++ e o usem diretamente no PyTorch, com suporte complete para rastreamento e script JIT. Veja nosso ‘Tocha fora da caixa’
postagem do weblog se você quiser saber mais sobre isso.

Usar operadores JIT em R costumava exigir que os desenvolvedores de pacotes implementassem C++/Rcpp para cada operador se quisessem poder chamá-los diretamente do R. Esta versão adicionou suporte para chamar operadores JIT sem exigir que os autores implementassem os wrappers.

A única mudança visível é que agora temos um novo símbolo no namespace da tocha, chamado
jit_ops. Vamos carregar torchvisionlib, uma extensão torch que registra muitas operações JIT diferentes. Apenas carregando o pacote com library(torchvisionlib) disponibilizará seus operadores para uso pelo torch – isso ocorre porque o mecanismo que registra os operadores atua quando a DLL do pacote (ou biblioteca compartilhada) é carregada.

Por exemplo, vamos usar o read_file operador que lê eficientemente um arquivo em um tensor de tocha bruto (bytes).

torch_tensor
 137
  80
  78
  71
 ...
   0
   0
 103
... (the output was truncated (use n=-1 to disable))
( CPUByteType{325862} )

Fizemos com que o preenchimento automático funcionasse bem, de modo que você pudesse explorar interativamente os operadores disponíveis usando jit_ops$ e pressionando para acionar o preenchimento automático do RStudio.

Outras pequenas melhorias

Esta versão também adiciona muitas pequenas melhorias que tornam a tocha mais intuitiva:

  • Agora você pode especificar o tipo de tensor usando uma string, por exemplo: torch_randn(3, dtype = "float64"). (Anteriormente você tinha que especificar o dtype usando uma função torch, como torch_float64()).

    torch_randn(3, dtype = "float64")
    torch_tensor
    -1.0919
     1.3140
     1.3559
    ( CPUDoubleType{3} )
  • Agora você pode usar with_device() e local_device() para modificar temporariamente o dispositivo no qual os tensores são criados. Antes, você tinha que usar gadget em cada chamada de função de criação de tensor. Isso permite inicializar um módulo em um dispositivo específico:

    with_device(gadget="mps", {
      linear <- nn_linear(10, 1)
    })
    linear$weight$gadget
    torch_device(kind='mps', index=0)
  • Agora é possível modificar temporariamente a semente da tocha, o que facilita a criação de programas reproduzíveis.

    with_torch_manual_seed(seed = 1, {
      torch_randn(1)
    })
    torch_tensor
     0.6614
    ( CPUFloatType{1} )

Obrigado a todos os contribuidores do ecossistema torch. Este trabalho não seria possível sem todas as questões úteis abertas, PRs que vocês criaram e seu trabalho duro.

Se você é novo no uso de tochas e quer aprender mais, recomendamos fortemente o anunciado recentemente livro ‘Aprendizagem Profunda e Computação Científica com R torch‘.

Se você quiser começar a contribuir para o torch, sinta-se à vontade para entrar em contato no GitHub e ver nosso guia de contribuição.

O changelog completo para esta versão pode ser encontrado aqui.

Foto por Ian Schneider sobre Desaparecer

Reutilizar

Texto e figuras são licenciados sob Artistic Commons Attribution CC BY 4.0. As figuras que foram reutilizadas de outras fontes não se enquadram nesta licença e podem ser reconhecidas por uma nota na legenda: “Figura de …”.

Citação

Para atribuição, cite este trabalho como

Falbel (2023, June 7). Posit AI Weblog: torch 0.11.0. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2023-06-07-torch-0-11/

Citação BibTeX

@misc{torch-0-11-0,
  creator = {Falbel, Daniel},
  title = {Posit AI Weblog: torch 0.11.0},
  url = {https://blogs.rstudio.com/tensorflow/posts/2023-06-07-torch-0-11/},
  yr = {2023}
}

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *