Numpy: Cara mengatur float32 sebagai default

Dibuat pada 19 Des 2015  ·  21Komentar  ·  Sumber: numpy/numpy

Saya menggunakan cuBLAS + numpy, cuBLAS berjalan sangat cepat di float32, 10 kali lebih cepat dari CPU.
Namun, saya perlu mengatur dtype=float32 setiap kali dengan tangan, itu membosankan. random.rand() bahkan tidak mendukung untuk membuat array float32.
Apakah ada cara untuk mengatur presisi default ke float32 di numpy?

numpy.dtype

Komentar yang paling membantu

Ini akan sangat berguna.

Semua 21 komentar

Tidak ada, maaf. Dan saya khawatir kita tidak mungkin menambahkan hal seperti itu karena itu harus berupa keadaan global, dan keadaan global semacam ini cenderung menciptakan semua jenis masalah (misalnya orang akan mencoba mengubah default di dalam perpustakaan, dan kemudian kode yang tidak terkait yang kebetulan menggunakan perpustakaan ini akan mulai melihat masalah aneh ketika kode yang tidak terkait mencoba menggunakan numpy).

Anda dapat membuat fungsi utilitas Anda sendiri dan menggunakannya, misalnya:

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

Ini akan sangat berguna.

Ini sudah tua, tetapi masih akan berguna (Anda dapat menemukan beberapa pertanyaan di Stack Overflow yang menanyakannya). Boleh saya tambahkan, status perpustakaan global sebenarnya bukan opsi _only_ untuk ini. Anda dapat memiliki variabel lingkungan, konfigurasi file, atau bahkan hanya manajer konteks. Misalnya Theano menawarkan file konfigurasi dan variabel lingkungan. Saya membayangkan Anda dapat memiliki ukuran float default (seperti Theano's floatX ) dan mungkin ukuran integer default (dan bahkan ukuran kompleks default jika Anda ingin mendorongnya?). Juga, ini tidak terlalu signifikan, tetapi setidaknya sudah ada _some_ status global di NumPy, misalnya set_printoptions (yang pada prinsipnya dapat Anda kacaukan dari perpustakaan, atau dari utas yang berbeda); mungkin memiliki cara yang seragam untuk mengonfigurasi perpustakaan bukanlah ide yang buruk.

Saya tidak mengatakan itu langsung, karena mungkin mempengaruhi sebagian besar kode, dan tentu saja ada banyak kasus sudut untuk itu, tapi saya pikir itu mungkin layak dipertimbangkan, bahkan jika hanya sebagai item peta jalan potensial.

Terutama seperti bagaimana dengan pembelajaran mendalam (tensorflow, pytorch, dll), orang memanipulasi array presisi yang lebih kecil dari 64 bit hampir 100% dari waktu (terutama 32 bit, tetapi presisi campuran dan model terkuantisasi mendapatkan banyak landasan, dengan dukungan resmi dari semua vendor top)

Saya memiliki masalah yang sama persis. Mengalami masalah dengan matriks yang sangat besar dalam modul yang sangat panjang yang membuat banyak panggilan ke np.array . Tidak dapat mengubah semua panggilan untuk menentukan argumen opsional (dtype=np.float32). Saya hanya ingin memberi tahu numpy untuk menggunakan float32 alih-alih float64. OS sedang bertukar sekarang. Tolong bantu.

Aku benci aku harus melakukan ini setiap saat

@soulslicer masalah ini sudah ditutup, kami tidak akan mengubah ini di masa mendatang. Mungkin monkey-patching np.array untuk menambahkan dtype default akan menyelesaikan masalah Anda. Anda dapat mengatur agar ini dipanggil saat startup python melalui PYTHONSTARTUP untuk pekerjaan interaktif, atau memasukkannya ke dalam file dan mengimpornya saat startup proyek.

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

hehe, cara lain ;)

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

FYI dengan jaringan saraf yang dalam menjadi sangat besar, semakin banyak orang akan mengikuti fitur ini.

lol @ numpy

hei saya ingin setiap nomor menempati 38 pertunjukan di komputer Anda

Bukan itu yang dipertaruhkan di sini @JadBatmobile

njsmith menjelaskan secara jelas 3 tahun yang lalu mengapa "fitur" ini dengan sangat mudah (baca: dalam satu baris kode) menyebabkan banyak bug laten dan non-lokal. "Fitur" semacam itu hanya boleh digunakan secara bertanggung jawab. Saya tidak berpikir menerapkan fitur yang perlu digunakan secara bertanggung jawab adalah ide yang bagus. Jika Anda tahu Anda menggunakannya, dan akan menggunakannya secara bertanggung jawab: pilih satu dari beberapa saran yang disebutkan di utas ini (dan bahkan lebih banyak lagi di tempat lain), dan buat kode Anda sendiri secara eksplisit berperilaku seperti ini.

@adeak Saya tidak yakin apakah ini ide yang bagus, tapi mungkin beberapa manajer konteks akan menjadi kompromi yang baik?

Kode semu:

<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)

Penggunaan:

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

@ dankal444 jika saya mengerti dengan benar, tidak ada yang akan menghentikan orang dari menjadi malas dan memanggil change_default_dtype(dtype) secara manual, tanpa jaminan untuk pembersihan.

@adeak Saya pikir metode "tidak menyenangkan" ini dapat disembunyikan dari perspektif orang dan hanya manajer konteks yang tersedia

Saya menduga bahwa orang yang menuntut fitur ini tidak akan senang dengan manajer konteks; itu akan lebih rumit daripada satu langkah konfigurasi khusus yang harus dilakukan sekali. Orang bisa saja mulai menggunakan fungsi non-publik yang memiliki status global untuk menyelesaikannya, mengalahkan tujuannya.

Saya tidak berpikir manajer konteks banyak membantu. Anda akan selalu masuk ke masalah bahwa Anda dapat menggunakan fungsi hilir yang menggunakan presisi yang lebih besar untuk alasan yang baik, dan Anda hanya merusaknya. Heck, Anda bahkan dapat menyebabkan segfault, karena kode antarmuka-C hampir tidak memiliki alasan untuk memeriksa ulang apakah array yang baru dibuat memiliki tipe data yang salah.

Saya menemukan di level rendah, ada NPY_DEFAULT_TYPE, mungkin numpy dapat menyediakan fungsi untuk mengubah nilai Variabel ini menjadi float32?

Sangat sulit untuk mendeklarasikan np.float32 dtype saat membuat array baru

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

2zly45

[Bob] Bagaimana saya bisa membuat array float32 acak yang menghabiskan 90% dari RAM yang tersedia?
[Numpy] Gandakan saja RAMnya...

Setiap orang memiliki pendapat akhir-akhir ini yang mengintai untuk berekspresi, pendapat saya adalah bahwa ini mungkin salah satu keputusan desain yang paling "gila dan kejam"* yang pernah saya lihat, layak mendapatkan nominasi yang sah hall of fame pribadi saya

"gila dan kejam"* - ungkapan idiomatik yang berasal dari bahasa Rusia

[Pepatah 1] Jika membatasi maka tidak peduli seberapa ramping arsitektur Anda.
[Pepatah 2] Dalam banyak kasus "pythonic" hanyalah sebuah label, yang terakhir menutupi rasa malu

Sekali lagi: alasan untuk tidak menerapkan ini bukan karena kami suka membuang-buang memori Anda, itu akan merusak semua jenis hal dan menyebabkan Anda diam-diam mendapatkan jawaban yang salah. Fakta bahwa begitu banyak orang berpikir itu adalah hal yang "jelas" untuk dilakukan menegaskan bahwa kebanyakan orang tidak memahami konsekuensi penuh di sini, dan tidak akan siap untuk menilai kapan fitur ini aman digunakan dan kapan tidak.

Saya mendengar rasa sakit yang Anda semua alami; itu benar-benar valid, dan kami ingin membantu jika kami bisa. Tetapi untuk melakukan itu seseorang harus membuat rencana yang tidak merusak segalanya.

Mengunci masalah ini karena jelas merupakan magnet bagi komentar yang tidak produktif. Jika Anda memiliki ide baru, silakan buka edisi baru.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat