Numpy: Como definir float32 como padrão

Criado em 19 dez. 2015  ·  21Comentários  ·  Fonte: numpy/numpy

Eu uso cuBLAS + numpy, cuBLAS roda muito rápido no float32, 10 vezes mais rápido que a CPU.
No entanto, preciso definir dtype = float32 sempre à mão, é tedioso. random.rand () ainda não suporta a criação de um array float32.
Existe alguma maneira de definir a precisão padrão para float32 em numpy?

numpy.dtype

Comentários muito úteis

Isso seria muito útil.

Todos 21 comentários

Não há, desculpe. E temo que não possamos adicionar tal coisa porque necessariamente teria que ser um estado global, e esse tipo de estado global tende a criar todos os tipos de problemas (por exemplo, as pessoas vão tentar mudar o padrão dentro de uma biblioteca, e então o código não relacionado que usa esta biblioteca começará a ter problemas estranhos quando o código não relacionado tentar usar o numpy).

Você pode fazer suas próprias funções de utilitário e usá-las, por exemplo:

def array(*args, **kwargs):
    kwargs.setdefault("dtype", np.float32)
    return np.array(*args, **kwargs)

Isso seria muito útil.

Isso é antigo, mas ainda seria útil (você pode encontrar um punhado de perguntas no Stack Overflow perguntando sobre isso). Devo acrescentar que um estado de biblioteca global não é realmente a opção _única_ para isso. Você pode ter uma variável de ambiente, uma configuração de arquivo ou mesmo apenas um gerenciador de contexto. Por exemplo, Theano oferece um arquivo de configuração e uma variável de ambiente. Eu imagino que você poderia ter um tamanho de float padrão (como floatX Theano) e talvez um tamanho inteiro padrão (e até mesmo um tamanho complexo padrão se você quiser empurrá-lo?). Além disso, não é tão significativo, mas já existe pelo menos _algo_ estado global em NumPy, por exemplo, set_printoptions (que você poderia, em princípio, bagunçar de uma biblioteca ou de diferentes threads); talvez ter uma maneira uniforme de configurar a biblioteca não seja uma ideia tão ruim.

Não estou dizendo que seja direto, pois provavelmente afeta uma grande parte do código e, certamente, há muitos casos extremos, mas acho que pode valer a pena considerar, mesmo que apenas como um item de roadmap potencial.

Especialmente como com o aprendizado profundo (tensorflow, pytorch, etc), as pessoas estão manipulando matrizes de precisão menores que 64 bits quase 100% do tempo (principalmente 32 bits, mas precisão mista e modelos quantizados estão ganhando muito terreno, com suporte oficial de todos os principais fornecedores)

Eu tenho exatamente o mesmo problema. Tendo alguns problemas com matrizes muito grandes em um módulo muito longo que faz muitas chamadas para np.array . Não é possível alterar todas as chamadas para especificar o argumento opcional (dtype = np.float32). Só quero dizer a numpy para usar float32 em vez de float64. O sistema operacional está trocando agora. Por favor ajude.

Eu odeio ter que fazer isso sempre

@soulslicer, este problema está encerrado, não vamos mudar isso em um futuro concebível. Talvez monkey-patching np.array para adicionar um dtype padrão resolveria seu problema. Você pode fazer com que isso seja chamado na inicialização do python via PYTHONSTARTUP para trabalho interativo, ou colocá-lo em um arquivo e importar na inicialização do projeto.

import numpy as np
_oldarray = np.array
def array32(*args, **kwargs):
    if 'dtype' not in kwargs:
        kwargs['dtype] = 'float32'
    _oldarray(*args, **kwargs)
np.array = _oldarray

heh, outro jeito;)

from functools import partial
import numpy as np
array32 = partial(np.array, dtype=np.float32)

Para sua informação, com as redes neurais profundas se tornando tão grandes, mais e mais pessoas estarão atrás desse recurso.

Rsrs @ numpy

Ei, eu quero que cada número ocupe 38 GB no seu computador

Não é isso que está em jogo aqui @JadBatmobile

njsmith explicou em termos claros há 3 anos porque esse "recurso" levaria muito facilmente (leia-se: em uma linha de código) a muitos bugs latentes e não locais. Tal "recurso" só deve ser usado com responsabilidade. Não acho que implementar recursos que precisam ser usados ​​com responsabilidade seja uma boa ideia. Se você sabe que está usando e vai usá-lo com responsabilidade: escolha uma das várias sugestões mencionadas neste tópico (e ainda mais em outro lugar) e faça com que seu próprio código se comporte explicitamente dessa maneira.

@adeak Não tenho certeza se isso é uma boa ideia, mas talvez algum gerenciador de contexto seria um bom compromisso?

Pseudo-código:

<strong i="8">@contextmanager</strong>
def default_dtype(dtype):
    # read current default dtype and change to the one provided
    original_dtype = read_current_default_dtype()
    change_default_dtype(dtype)
    yield
    # change default dtype to original value
    change_default_dtype(original_dtype)

Uso:

with np.default_dtype(np.float32):
    # do float32 stuff

@ dankal444 se bem entendi, nada impediria as pessoas de serem preguiçosos e ligar para o ameaçador change_default_dtype(dtype) manualmente, sem garantia de limpeza.

@adeak eu pensei que este método "nefasto" poderia ser escondido da perspectiva das pessoas e apenas o gerenciador de contexto disponibilizado

Suspeito que as pessoas que exigem esse recurso não ficarão satisfeitas com um gerenciador de contexto; isso seria ainda mais complicado do que uma única etapa de configuração personalizada a ser realizada uma vez. As pessoas poderiam simplesmente começar a usar a função privada que tem um estado global para acabar com isso, derrotando o propósito.

Não acho que os gerenciadores de contexto ajudem muito. Você sempre entrará no problema de poder usar funções posteriores que usam a maior precisão por um bom motivo, e você simplesmente as quebrará. Heck, você pode até causar segfault, porque o código de interface C dificilmente tem um motivo para verificar se um array recém-criado tem o tipo de dados errado.

Acho que em baixo nível, há um NPY_DEFAULT_TYPE, talvez numpy possa fornecer uma função para modificar esse valor de variável para float32?

É realmente difícil declarar np.float32 dtype ao criar uma nova matriz

https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api.dtype.html?highlight=default_type#c.NPY_DEFAULT_TYPE

2zly45

[Bob] Como posso criar uma matriz float32 aleatória que consome 90% da RAM disponível?
[Numpy] Basta dobrar a RAM ...

Todo mundo tem uma opinião hoje em dia que se esconde para se expressar, a minha é que esta é provavelmente uma das decisões de design mais "insanas e implacáveis" * que já vi, merece uma nomeação legítima meu hall da fama particular

"insano e implacável" * - expressão idiomática originária do russo

[Aforismo 1] Se for limitante, não importa o quão estreita seja sua arquitetura.
[Aforismo 2] Em muitos casos, "pythônico" é apenas um rótulo, o último que encobre a vergonha

Mais uma vez: a razão para não implementar este não é que nós como desperdiçar sua memória, é que ele vai quebrar todos os tipos de coisas e causar-lhe obter silenciosamente respostas erradas. O fato de tantas pessoas pensarem que é uma coisa "óbvia" de se fazer confirma que a maioria das pessoas não entende todas as consequências aqui e não estaria preparada para julgar quando esse recurso é seguro para usar e quando não é.

Eu ouço a dor que todos vocês estão sentindo; isso é totalmente válido e gostaríamos de ajudar se pudermos. Mas, para fazer isso, alguém tem que bolar um plano que não destrua tudo.

Bloquear esse problema, pois é claramente um ímã para comentários improdutivos. Se você tem uma nova ideia, abra uma nova edição.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

amuresan picture amuresan  ·  4Comentários

Foadsf picture Foadsf  ·  3Comentários

toddrjen picture toddrjen  ·  4Comentários

kevinzhai80 picture kevinzhai80  ·  4Comentários

astrofrog picture astrofrog  ·  4Comentários