Apakah floating point presisi tunggal begitu buruk?

8

Saya telah melihat beberapa paket dari Tinggi Perf tugas tampilan berurusan dengan perhitungan GPU, dan mengingat bahwa sebagian besar GPU tampaknya menjadi urutan besarnya lebih kuat dalam melakukan presisi aritmatika tunggal dari DP yang , saya bertanya-tanya:

  1. Mengapa tidak ada paket yang memberikan lebih banyak kontrol kepada pengguna pada jenis presisi yang dibutuhkan? Saya dapat melihat banyak aplikasi dalam statistik di mana aritmatika SP (yaitu angka berkode dengan 7 digit akurasi) cukup baik untuk penggunaan praktis (jika saya melebih-lebihkan keuntungan yang terlibat, beri tahu saya).
  2. Apakah python lebih fleksibel dalam hal ini? Jika demikian mengapa? Saya tidak melihat mengapa tidak adanya tipe 'tunggal' dalam R akan membuat menyertakan opsi seperti itu (bersama dengan peringatan) di katakanlah GPUtools atau magma tidak mungkin (meskipun saya akan senang ditampilkan salah).

NB: Saya secara khusus memikirkan aplikasi-aplikasi karena angkanya sudah berdasarkan dimensi dan terpusat (sehingga ketidaksetaraan Chebychev mengikat) berdasarkan dimensi.

pengguna603
sumber
2
Saya mengaku bingung oleh hal ini, meskipun telah berjuang beberapa kali untuk memahaminya: apakah ada pertanyaan di sini? "Begitu buruk" tidak jelas dan tidak memiliki referensi. Apa yang sebenarnya ingin Anda pahami atau cari tahu?
whuber
@ Wouber:> Pertanyaan saya tidak memiliki kata yang bagus. Mungkin karena itu disebabkan oleh ketidaktahuan: saya telah membaca beberapa kertas putih tentang penggunaan GPU, (meskipun, sayangnya ternyata, bukan referensi perintah R dari GPUtools) dan tidak bisa mengerti mengapa semua tes dilakukan dalam DP. Saya akan mengulang pertanyaannya (dan judulnya).
user603

Jawaban:

5

Dari file bantuan GPUtools , tampaknya itu useSingle=TRUEadalah fungsi default.

ars
sumber
@ kwak: Saya menemukan jawaban di atas bermanfaat, tetapi benar-benar tidak menjawab pertanyaan yang diajukan - "Apakah presisi tunggal begitu buruk?" Mungkin Anda harus menulis ulang pertanyaan Anda?
csgillespie
@csgellespie: Anda sepenuhnya benar. Saya akan menulis ulang pertanyaan ini sehingga dapat digunakan oleh pembaca masa depan. Memang, kata-katanya sangat buruk.
user603
4
  1. Karena sebelum GPU tidak ada arti praktis menggunakan real reals; Anda tidak pernah memiliki terlalu banyak akurasi dan memori biasanya tidak menjadi masalah. Dan hanya mendukung ganda membuat desain R lebih sederhana. (Meskipun R mendukung membaca / menulis real reals.)
  2. Ya, karena Python bertujuan untuk lebih kompatibel dengan bahasa yang dikompilasi. Namun Anda benar bahwa pembungkus R perpustakaan dimungkinkan untuk melakukan konversi in-fly (ini tentu saja membutuhkan waktu tetapi ini adalah masalah kecil); Anda dapat mencoba mengirim email kepada pengelola paket GPU yang meminta perubahan tersebut.

sumber
3

Saya kira dengan pemrograman GPU, maksud Anda pemrograman kartu nvidia? Dalam hal ini panggilan kode yang mendasarinya dari R dan python adalah ke C / CUDA .


Alasan sederhana bahwa hanya presisi tunggal yang ditawarkan adalah karena itulah yang didukung oleh sebagian besar kartu GPU.

Namun, arsitektur nvidia Fermi yang baru mendukung ketepatan ganda. Jika Anda membeli kartu grafis nvidia tahun ini, maka itu mungkin Fermi. Bahkan di sini segalanya tidak sederhana:

  • Anda mendapatkan sedikit performa jika Anda mengkompilasi dengan presisi ganda (faktor dua jika saya ingat dengan benar).
  • Pada kartu yang lebih murah, kartu Fermi, nvidia sengaja menonaktifkan presisi ganda. Namun, dimungkinkan untuk menyelesaikan ini dan menjalankan program presisi ganda. Saya berhasil melakukan ini pada GeForce GTX 465 saya di linux.

Untuk menjawab pertanyaan dalam judul Anda, "Apakah presisi tunggal OK?", Itu tergantung pada aplikasi Anda (maaf omong kosong jawaban!). Saya kira semua orang sekarang menggunakan presisi ganda karena tidak lagi memberikan kinerja yang baik.

Ketika saya mencoba-coba GPU, pemrograman tiba-tiba menjadi jauh lebih rumit. Anda harus khawatir tentang hal-hal seperti:

  • warpsize dan atur memori Anda dengan benar.
  • #threads per kernel.
  • debugging mengerikan - tidak ada pernyataan cetak dalam pernyataan kernel GPU
  • kurangnya generator bilangan acak
  • Presisi tunggal.
csgillespie
sumber
@ccgillespie:> saya pikir pertanyaan saya mungkin tidak diucapkan dengan baik. Dalam paket yang saya lihat (GPUtools, magma) presisi ganda tampaknya digunakan sebagai standar (dengan hilangnya kinerja yang Anda gambarkan). Saya bertanya-tanya mengapa presisi tunggal tidak ditawarkan sebagai opsi.
user603
@ kwak: Nilai presisi ganda harus dikonversi ke presisi tunggal oleh pembungkus. Bungkusnya hanya berusaha membantu.
csgillespie
@ccgillespie:> ya, tetapi sepertinya pembungkusnya datang dengan biaya kinerja melebihi faktor 2 yang Anda kutip (sekali lagi, koreksi saya jika ini salah) dan dalam beberapa kasus tidak ada manfaat nyata (saya bisa memikirkan banyak aplikasi dalam stat apakah aritmatika SP FP akan baik-baik saja). Saya bertanya-tanya apakah masuk akal untuk meminta opsi untuk mematikan bungkus kata.
user603
2
@kwak: Melirik file bantuan GPUtools, sepertinya itu useSingle=TRUEadalah fungsi default. Apakah saya melewatkan sesuatu di sini?
ars
@csgillespie: Ingat, sampai saat ini kartu nvidia yang paling baru tidak bisa melakukan komputasi presisi ganda. Faktor 2 hit adalah apa yang saya amati menggunakan kode C / CUDA mentah. Memiliki pembungkus python / R dapat memperburuk ini.
csgillespie
1

Sebagian besar GPU yang beredar hanya mendukung floating point presisi tunggal.

Sejauh pertanyaan judul, Anda perlu melihat data yang akan Anda tangani untuk menentukan apakah presisi tunggal cukup untuk Anda. Seringkali, Anda akan menemukan bahwa lajang dapat diterima dengan baik untuk> 90% dari data yang Anda tangani, tetapi akan gagal secara spektakuler untuk 10% terakhir; kecuali Anda memiliki cara mudah untuk menentukan apakah kumpulan data Anda akan gagal atau tidak, Anda terjebak menggunakan presisi ganda untuk semuanya.

Benjamin Chambers
sumber
Bisakah Anda sedikit menjelaskan? Tampaknya beberapa algoritma iteratif (pembalikan matriks, dekomposisi QR) tampaknya berfungsi dengan baik. Saya juga ingin tahu apakah ketidaktepatan SP menjadi lebih banyak masalah untuk operasi yang melibatkan array yang lebih besar.
user603
Ada dua bagian untuk itu: 1) Apa yang diwakili oleh data? 2) Bagaimana Anda memproses data? Jika Anda melihat ribuan titik data dari studi medis, satu ketepatan mungkin akan banyak untuk mengukur kesehatan pasien, dan saya ragu Anda akan membutuhkan dua kali lipat. Geometri, di sisi lain, dapat membutuhkan presisi tunggal atau ganda tergantung pada skala & zoom Anda. Menghitung lintasan probe ke Saturnus akan selalu membutuhkan dua kali lipat, karena kesalahan kecil pun dapat secara drastis mempengaruhi hasilnya. Anda perlu melihat data dan memutuskan apa toleransi Anda.
Benjamin Chambers
1
Ini akan tergantung pada stabilitas numerik dari algoritma yang Anda gunakan dan seberapa baik masalahnya. Ingat bahwa presisi ganda memberi Anda akses ke nomor yang lebih kecil dan juga yang lebih besar.
James
1
Tidak harus angka yang lebih kecil atau lebih besar; ingat, kita berhadapan dengan floating point. Sebaliknya, ini memungkinkan Anda menggunakan angka yang lebih besar dan lebih kecil dalam hubungannya satu sama lain, sambil mempertahankan angka yang signifikan.
Benjamin Chambers
1

OK, jawaban baru untuk pertanyaan lama tetapi bahkan lebih relevan sekarang. Pertanyaan yang Anda ajukan berkaitan dengan ketepatan terbatas, biasanya bidang analisis sinyal dan matematika eksperimental.

Double precision (DP) float, mari kita berpura-pura bahwa masalah presisi hingga tidak ada, sama seperti yang kita lakukan pada kebanyakan masalah matematika dunia nyata. Dalam matematika eksperimental tidak ada yang pura-pura.

Pelampung presisi tunggal (SP) memaksa kita untuk mempertimbangkan derau kuantisasi. Jika model pembelajaran mesin kami secara inheren menolak kebisingan, seperti jaring saraf (NN), jaring konvolusional (CNN), jaring residual (ResN), dll, maka SP paling sering memberikan hasil yang mirip dengan DP.

Float setengah presisi (HP) (sekarang didukung dalam cuda toolkit 7.5) mensyaratkan agar efek kuantisasi (kebisingan dan pembulatan) dipertimbangkan. Kemungkinan besar kita akan segera melihat HP mengapung di toolkit pembelajaran mesin umum.

Ada pekerjaan baru-baru ini untuk membuat perhitungan presisi yang lebih rendah di float serta angka presisi tetap. Pembulatan stokastik telah memungkinkan konvergensi untuk melanjutkan dengan CNN sedangkan solusinya berbeda tanpa itu. Makalah ini akan membantu Anda meningkatkan pemahaman Anda tentang masalah dengan penggunaan angka presisi hingga dalam pembelajaran mesin.

Untuk menjawab pertanyaan Anda:

SP tidak terlalu buruk. Saat Anda menunjukkannya dua kali lebih cepat, tetapi juga memungkinkan Anda untuk menempatkan lebih banyak lapisan ke dalam memori. Bonus ada dalam menghemat overhead mendapatkan data dan mematikan GPU. Komputasi yang lebih cepat dan overhead yang lebih rendah menghasilkan waktu konvergensi yang lebih rendah. Konon, HP, untuk beberapa masalah, akan lebih baik di beberapa bagian jaringan dan tidak di yang lain.

  1. Menurut saya banyak toolkit pembelajaran mesin menangani SP dan DP. Mungkin orang lain dengan pengalaman yang lebih luas dengan toolkit ini akan menambahkan nickle mereka.
  2. Python akan mendukung apa yang didukung gpu toolkit. Anda tidak ingin menggunakan tipe data python karena Anda akan menjalankan skrip yang ditafsirkan pada cpu.

Perhatikan bahwa tren dalam jaringan saraf sekarang adalah untuk pergi dengan lapisan yang sangat dalam, dengan berjalan lebih dari beberapa hari umum pada kelompok GPU tercepat.

r3mnant
sumber