
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 atIsso 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
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, comotorch_float64()).torch_randn(3, dtype = "float64")torch_tensor -1.0919 1.3140 1.3559 ( CPUDoubleType{3} )Agora você pode usar
with_device()elocal_device()para modificar temporariamente o dispositivo no qual os tensores são criados. Antes, você tinha que usargadgetem 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$gadgettorch_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}
}