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
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 usargadget
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} }