2016-06-16 19 views
23

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

+1

Ô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! –

+0

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. –

+0

Đã 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/ –

Trả lời

10

Theo dõi:

kết luận sơ khởi của tôi là libs Atlas được cài đặt theo mặc định trên dụ Amazon EMR chỉ đơn giản là chậm. Hoặc là một bản dựng chung chưa được tối ưu hóa cho loại máy cụ thể, hoặc về cơ bản là chậm hơn so với các thư viện khác.Sử dụng script làm hướng dẫn này, tôi đã xây dựng và cài đặt OpenBLAS cho loại máy cụ thể mà tôi đang chạy các tiêu chí chuẩn (tôi cũng tìm thấy một số thông tin hữu ích here). Khi OpenBLAS đã được cài đặt ma trận 3000x3000 ma trận nhân của tôi hoàn thành trong 3.9s (so với 15.1 được liệt kê ở trên khi sử dụng bản đồ mặc định libs). Điều này vẫn còn chậm hơn so với cùng một điểm chuẩn chạy trên máy Mac của tôi (theo hệ số x2), nhưng sự khác biệt này nằm trong phạm vi có thể đáng tin cậy là do hiệu suất h/w cơ bản.

Dưới đây là một danh sách đầy đủ của các lệnh tôi dùng để cài đặt OpenBLAS libs trên EMR của Amazon, Spark dụ:

sudo yum install git 
git clone https://github.com/xianyi/OpenBlas.git 
cd OpenBlas/ 
make clean 
make -j4 
sudo mkdir /usr/lib64/OpenBLAS 
sudo chmod o+w,g+w /usr/lib64/OpenBLAS/ 
make PREFIX=/usr/lib64/OpenBLAS install 
sudo rm /etc/ld.so.conf.d/atlas-x86_64.conf 
sudo ldconfig 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3.5 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3 
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3.5 
+0

Các bước tôi đang chạy trong AWS vẫn cho rằng tôi đang chạy F2J.Bạn đã thực hiện các bước nào khác để chỉ gió đến thư viện gốc này? Bạn có bao gồm phần mềm gốc tự nhiên không? Ý nghĩa của việc bao gồm lớp học bổ sung trong câu hỏi của bạn là gì? Trong ví dụ của bạn đó là những gì dường như để lấy lib bản địa chứ không phải F2J. –

Các vấn đề liên quan