Tôi đang cố gắng thiết lập một môi trường để hỗ trợ phân tích dữ liệu thăm dò trên một cụm. Dựa trên một khảo sát ban đầu về những gì trên mạng, mục tiêu của tôi là sử dụng Scala/Spark với Amazon EMR để cung cấp cụm.Cách cấu hình BLAS/LAPACK hiệu năng cao cho Breeze trên Amazon EMR, EC2
Hiện tại tôi chỉ đang cố gắng lấy một số ví dụ cơ bản và chạy để xác thực rằng tôi đã có mọi thứ được định cấu hình đúng cách. Vấn đề tôi gặp phải là tôi không thấy hiệu suất mà tôi mong đợi từ các thư viện Atlas BLAS trên cá thể máy Amazon.
Dưới đây là đoạn mã của điểm chuẩn đơn giản của tôi. Nó chỉ là một ma trận vuông nhân tiếp theo là chất béo ngắn nhân và một nhân cao mỏng để tạo ra một ma trận nhỏ có thể được in (tôi muốn chắc chắn Scala sẽ không bỏ qua bất kỳ phần nào của tính toán do đánh giá lười biếng).
Tôi đang sử dụng Breeze cho thư viện đại số tuyến tính và netlib-java để kéo trong các thư viện có nguồn gốc địa phương cho BLAS/LAPACK
import breeze.linalg.{DenseMatrix, DenseVector}
import org.apache.spark.annotation.DeveloperApi
import org.apache.spark.rdd.RDD
import org.apache.spark.{Partition, SparkContext, TaskContext}
import org.apache.spark.SparkConf
import com.github.fommil.netlib.BLAS.{getInstance => blas}
import scala.reflect.ClassTag
object App {
def NaiveMultiplication(n: Int) : Unit = {
val vl = java.text.NumberFormat.getIntegerInstance.format(n)
println(f"Naive Multipication with vector length " + vl)
println(blas.getClass().getName())
val sm: DenseMatrix[Double] = DenseMatrix.rand(n, n)
val a: DenseMatrix[Double] = DenseMatrix.rand(2,n)
val b: DenseMatrix[Double] = DenseMatrix.rand(n,3)
val c: DenseMatrix[Double] = sm * sm
val cNormal: DenseMatrix[Double] = (a * c) * b
println(s"Dot product of a and b is \n$cNormal")
}
Dựa trên một cuộc khảo sát web của tiêu chuẩn Tôi đang mong đợi một ma trận 3000x3000 nhân lên để lấy xấp xỉ. 2-4s sử dụng thư viện BLAS gốc, được tối ưu hóa. Khi tôi chạy cục bộ trên MacBook Air, điểm chuẩn này hoàn thành trong 1,8 giây. Khi tôi chạy điều này trên EMR nó hoàn thành trong khoảng. 11s (sử dụng một trường hợp g2.2xlarge, mặc dù kết quả tương tự thu được trên một ví dụ m3.xlarge). Như một kiểm tra chéo tôi chạy một AMI EC2 dựng sẵn từ BIDMach project trên cùng một kiểu EC2, g2.2xlarge, và có 2.2s (lưu ý, điểm chuẩn GPU cho cùng một tính toán mang lại 0.047s).
Tại thời điểm này tôi nghi ngờ rằng netlib-java không tải đúng lib, nhưng đây là nơi tôi bị kẹt. Tôi đã trải qua README netlib-java nhiều times và có vẻ như libs ATLAS đã được cài đặt theo yêu cầu (xem dưới đây)
[[email protected] ~]$ ls /usr/lib64/atlas/
libatlas.a libcblas.a libclapack.so libf77blas.so liblapack.so libptcblas.so libptf77blas.so
libatlas.so libcblas.so libclapack.so.3 libf77blas.so.3 liblapack.so.3 libptcblas.so.3 libptf77blas.so.3
libatlas.so.3 libcblas.so.3 libclapack.so.3.0 libf77blas.so.3.0 liblapack.so.3.0 libptcblas.so.3.0 libptf77blas.so.3.0
libatlas.so.3.0 libcblas.so.3.0 libf77blas.a liblapack.a libptcblas.a libptf77blas.a
[[email protected] ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[[email protected] ~]$ ls /etc/ld.so.conf.d
atlas-x86_64.conf kernel-4.4.11-23.53.amzn1.x86_64.conf kernel-4.4.8-20.46.amzn1.x86_64.conf mysql55-x86_64.conf R-x86_64.conf
[[email protected] ~]$ cat /etc/ld.so.conf.d/atlas-x86_64.conf
/usr/lib64/atlas
Dưới đây tôi đã thấy 2 ví dụ chạy benchmark trên Amazon EMR dụ. Đầu tiên cho thấy khi hệ thống BLAS gốc được cho là tải chính xác. Thứ hai cho thấy khi BLAS gốc không tải và gói rơi trở lại thực hiện tham chiếu. Vì vậy, nó có vẻ như đang tải một BLAS gốc dựa trên các thông điệp và thời gian. So với chạy cục bộ trên máy Mac của tôi, trường hợp BLAS không chạy trong cùng khoảng thời gian, nhưng trường hợp BLAS gốc chạy trong 1,8 giây trên máy Mac của tôi so với 15 trong trường hợp bên dưới. Các thông báo thông tin giống nhau đối với máy Mac của tôi so với EMR (ngoài các tên tệp/dir cụ thể, v.v.).
[[email protected] ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --conf "spark.driver.extraClassPath=/home/hadoop/simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:30:39 AM com.github.fommil.jni.JniLoader liberalLoad
INFO: successfully loaded /tmp/jniloader2856061049061057802netlib-native_system-linux-x86_64.so
com.github.fommil.netlib.NativeSystemBLAS
Dot product of a and b is
1.677332076284315E9 1.6768329748988206E9 1.692150656424957E9
1.6999000993276503E9 1.6993872020220244E9 1.7149145239563465E9
Elapsed run time: 15.1s
[[email protected] ~]$
[[email protected] ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
com.github.fommil.netlib.F2jBLAS
Dot product of a and b is
1.6640545115052865E9 1.6814609592261212E9 1.7062846398842275E9
1.64471099826913E9 1.6619129531594608E9 1.6864479674870768E9
Elapsed run time: 28.7s
Tại thời điểm này, tôi đoán tốt nhất là nó thực sự đang tải một lib gốc, nhưng nó đang tải một bản chung. Bất kỳ đề xuất nào về cách tôi có thể xác minh thư viện được chia sẻ nào sẽ được chọn vào thời gian chạy? Tôi đã thử 'ldd' nhưng điều đó dường như không làm việc với tia lửa gửi. Hoặc có thể sự mong đợi của tôi đối với Atlas là sai, nhưng có vẻ khó tin rằng AWS sẽ cài đặt sẵn libs nếu họ không chạy một tốc độ cạnh tranh hợp lý.
Nếu bạn thấy rằng các lib không được liên kết chính xác trên EMR, vui lòng cung cấp hướng dẫn về những gì tôi cần làm để libs Atlas được nhận bởi netlib-java.
nhờ tim
Ông có thể chuyển đổi "theo dõi" vào câu trả lời? Nó cung cấp thông tin chi tiết hữu ích và nếu không có bất kỳ câu trả lời nào khác, tôi muốn trao phần thưởng. Cảm ơn trước! –
Tôi thậm chí không thể tạo lại trường hợp đầu tiên mà bạn kéo trong lib bản đồ EMR mặc định. Bạn đã làm những việc khác một cách khác nhau (không được liệt kê trong bài viết của bạn) mà gây ra lib tự nhiên được sử dụng thay vì F2jBLAS? Dù tôi có cố gắng thế nào đi chăng nữa, tôi dường như vẫn nhận được F2J. –
Đã lâu rồi tôi mới nhìn vào điều này. Tôi nghĩ cách netlib được tích hợp với Breeze đã thay đổi một chút. Nhưng như tôi nhớ lại, chìa khóa để vượt qua vấn đề của bạn là bao gồm .jar chứa thư viện gốc. Tại thời điểm khi tôi lần đầu tiên đăng trên, jar HAD được bao gồm một cách rõ ràng với một biến đường dẫn bổ sung. Nó KHÔNG được bao gồm trong lọ chất béo với ứng dụng của tôi. Đây là một bài viết tốt về thiết lập netlib sử dụng BLAS https://datasciencemadesimpler.wordpress.com/tag/blas/ –