Data.table: Perubahan R-devel; R-API di dalam region paralel

Dibuat pada 30 Nov 2018  ·  4Komentar  ·  Sumber: Rdatatable/data.table

Luke Tierney menghubungi saya tentang masalah memori di R-devel. Pengujian diteruskan pada CRAN dan Travis / Appveyor, tetapi penggunaan memori lebih tinggi dalam beberapa kasus. Seperti sebelumnya, pengumpul sampah mati.
Tidak yakin kapan tepatnya perubahan R-devel dilakukan, tetapi beberapa saat dalam sebulan terakhir atau lebih. Mungkin perubahan R-devel menyebabkan masalah memori baru, atau bahwa perubahan R-devel mengungkapkan masalah yang sudah ada (bahkan mungkin dengan data.table-release pada R-release). Bagaimanapun, itu perlu diperbaiki.

Luke menulis:

I distilled the issue in 'constellation' down to the attached file
from the examples. If I run this the memory usage is much bigger than
previously and the gc() output is garbled. It's a
multi-threading issue again; everything looks fine with
OMP_NUM_THREADS=1. With mutlipe threads you are
calling DATAPTR from threads other than the main one and that creates
a race on setting the R_GCEnabled flag, so eventually it is getting
stuck on off. I instrumented the places where the GC is disabled and
tracked this as the first one from a thread other than the main one:

#4  0x00007ffff78ba9d5 in DATAPTR (x=x@entry=0x1167458)
     at ../../../R/src/include/Rinlinedfuns.h:106
#5  0x00007fffea02c4c8 in subsetVectorRaw (target=0x4529590, source=0x1167458,
     idx=0x4175210, any0orNA=FALSE) at subset.c:44
#6  0x00007fffea02c7a6 in subsetDT (x=<optimized out>, rows=<optimized out>,
     cols=<optimized out>) at subset.c:272

Mengingat detail Luke, mudah untuk melihat masalah dalam kode tanpa perlu mereproduksi. Semua penggunaan R API perlu dilakukan di luar semua wilayah paralel seperti yang diminta Luke sebelumnya. Saya menunda melakukan itu terakhir kali karena tekanan waktu, dan sekarang perlu ditangani. Terakhir kali saya baru melakukan langkah pertama yaitu memastikan bahwa DATAPTR yang berada di wilayah paralel tidak menerima ALTREP.

Ini membutuhkan percepatan rilis 1.12.0, paling tidak karena berdampak pada Luke.

$ grep "omp.*parallel" *.c

  • [x] subset.c
  • [x] menyusun ulang.c
  • [x] fwrite.c
  • [x] fread.c
  • [x] fsort.c
  • [x] forder.c
  • [x] antara.c

$ grep ALTREP *.c

  • [x] antara.c
  • [x] fsort.c
  • [x] menyusun ulang.c
  • [x] wrappers.c
R-devel bug

Komentar yang paling membantu

hebatnya Luke untuk melakukan semua kerja keras untuk mengidentifikasi penyebabnya! 💯

Semua 4 komentar

hebatnya Luke untuk melakukan semua kerja keras untuk mengidentifikasi penyebabnya! 💯

Saya dalam proses mengkonfirmasikan dengan Luke bahwa itu sudah diperbaiki sebelum menutup ...

Dikonfirmasi telah diperbaiki. Terima kasih kepada @ltierney atas bantuannya.


Untuk kelengkapan seandainya kita perlu merujuk kembali ...
Saya tidak dapat mereproduksi masalah dengan R-devel yang dikompilasi sebagai berikut. (Saya perlu mengonfirmasi bahwa saya dapat mereproduksi masalah dengan 1.11.8 sebelum saya dapat mengonfirmasi 1.11.9 memperbaikinya.)

./configure --without-recommended-packages --disable-byte-compiled-packages --enable-strict-barrier CC="gcc -fsanitize=address -fno-sanitize=float-divide-by-zero -fno-omit-frame-pointer" CFLAGS="-O0 -g -Wall -pedantic"

bahkan dengan naskah yang disediakan Lukas:

library(data.table)
library(constellation)
temp <- as.data.table(vitals[VARIABLE == "TEMPERATURE"])
pulse <- as.data.table(vitals[VARIABLE == "PULSE"])
resp <- as.data.table(vitals[VARIABLE == "RESPIRATORY_RATE"])
temp[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
pulse[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
resp[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
gc()
for (i in 1:10) {
  cat("i=",i,"\n")
  b1 <- bundle(temp, pulse, resp,
    bundle_names = c("PLATELETS", "INR"), window_hours_pre = 24,
    window_hours_post = c(6, 6), join_key = "PAT_ID",
    time_var = "RECORDED_TIME", event_name = "CREATININE", mult = "all")
}
gc()

Singkatnya, saya mengkompilasi ulang R-devel lebih sederhana sebagai berikut, masih dengan --enable-strict-barrier yang merupakan hal yang penting:
./configure --without-recommended-packages --enable-strict-barrier
menginstal ulang konstelasi dan semua dependensinya serta data.table 1.11.8, dan kali ini skrip Luke gagal dengan benar:

Fatal error: Wrong thread calling 'RunFinalizers'

Menginstal data.table-dev (1.11.9) ke dalam R-devel dan menjalankan ulang ini, berfungsi dengan baik. Menginstal ulang data.table 1.11.8 kembali gagal. Jadi memang sudah diperbaiki oleh 1.11.9. Dalam kompilasi R-devel asli saya, mungkin ada sesuatu yang membuat 1.11.8 berfungsi (menonaktifkan kompilator byte, -00, ASAN, dll). Bagaimanapun, kompilasi R-devel yang lebih sederhana diperlukan dan patut untuk dicoba.

@jangorecki Jika waktu memungkinkan, akan sangat bagus untuk menambahkan --enable-strict-barrier ke R-devel yang digunakan dalam pipeline CI. Saya tidak tahu apakah Anda mengkompilasi R-devel atau tidak untuk pipeline CI.

@mattdowle ya saya mengkompilasi R-devel setiap hari, akan menambahkan bendera ini di sana. Ditambahkan ke jangan lupa di # 3147

Apakah halaman ini membantu?
0 / 5 - 0 peringkat