বড় সমবায় ম্যাট্রিক্সের সমান্তরাল গণনা


9

আমাদের থেকে শুরু করে আকারের সমবায় ম্যাট্রিকগুলি গণনা করা দরকার 10000×10000 প্রতি 100000×100000। আমাদের জিপিইউ এবং ক্লাস্টারগুলিতে অ্যাক্সেস রয়েছে, আমরা অবাক হয়ে দেখি যে এই কম্পিউটারগুলি দ্রুততর করার জন্য সর্বোত্তম সমান্তরাল পদ্ধতি approach


1
আপনি কি আপনার সমবায় ম্যাট্রিক্সের জন্য বিশেষত্ব আশা করেন? উদাহরণস্বরূপ, সংখ্যার "কাছাকাছি 0" সংখ্যক?
ডাঃ_সাম

না, আমরা এখনই কিছু আশা করতে পারি না
খোলা

আপনার কে কি? এটি হ'ল প্রতিটি ডেটা ভেক্টর কতক্ষণ থাকে। তারা ইতিমধ্যে শূন্য-মানে?
সর্বাধিক হাচিনসন

না, তারা শূন্য-গড়িত নয়, তারা যে কোনও মান নিতে পারে
খুলুন

3
@ ফ্লো: '' ক্লিনিকাল ডেটা '' অ্যাপ্লিকেশন, তবে ব্যবহার নয়। আমার প্রশ্নটি ছিল: ধরুন আপনার কাছে কোভেরিয়েন্স ম্যাট্রিক্স রয়েছে, আপনি এটি দিয়ে কী করতে যাচ্ছেন (গাণিতিক দিক থেকে)? আমি জিজ্ঞাসার কারণটি হ'ল শেষ পর্যন্ত একজন সর্বদা এটির থেকে খুব কম গণনা করেন এবং যদি এটি বিবেচনায় নেওয়া হয় তবে সাধারণত পুরো কোভারিয়েন্স ম্যাট্রিক্স গণনা করা এড়িয়ে চলার পরে ফলাফলটি পাওয়ার পরেও বিষয়গুলিকে প্রচুর গতি বাড়িয়ে তুলতে পারে।
আর্নল্ড নিউমায়ার

উত্তর:


17

প্রথম জিনিসটি আপনি BLAS ব্যবহার করে এটি করতে পারেন তা শনাক্ত করা। আপনি যদি ম্যাট্রিক্স ডেটা হয়X=[x1x2x3...]Rm×n (প্রতিটি xএকটি পরিমাপের সাথে সম্পর্কিত কলামের ভেক্টর; সারিগুলি ট্রায়ালগুলি হয়), তারপরে আপনি সমাহারটি লিখতে পারেন:

Cij=E[xi,xj]E[xi]E[xj]=1nkxikxjk1n2(kxik)(kxjk)
আমরা এটি লিখতে পারি:
C=1nXTX1n2(1TX)T(1TX)
কোথায় (1T) সমস্ত উপাদান 1 এর সাথে সারি-ভেক্টর (1TX) এর কলামের সারিগুলির সারি ভেক্টর X। এটি পুরোপুরি BLAS হিসাবে লেখা যেতে পারে, যেখানেXTXহয় একটি হল GEMM বা, এখনো ভাল, একটি SYRK / Herk এবং আপনি পেতে পারেন(1TX)=bএকটি জিইএমভি সহ ,bTbআবার জেমম বা সিওয়াইআরকে / এইচআরকে এবং এসসিএল সহ প্রিফ্যাক্টর সহ

আপনার ডেটা এবং ফলাফলের ম্যাট্রিকগুলি প্রায় .৪ জিবি হতে পারে, সুতরাং আপনি কোনও একক নোডে বা নোডের জিপিইউতে মূল্যবান হতে চলেছেন না। নন-জিপিইউ ক্লাস্টারের জন্য, আপনি পিবিএলএএসের দিকে নজর রাখতে চাইতে পারেন যা স্কেলাপ্যাকের মতো মনে হয়। জিপিইউগুলির জন্য, মাল্টি-নোড লাইব্রেরিগুলি এখনও যথেষ্ট নেই। ম্যাগমার কিছুটা অন্তর্নিহিত সমান্তরাল বিএলএএস বাস্তবায়ন রয়েছে তবে এটি ব্যবহারকারী হিসাবে বন্ধুত্বপূর্ণ হতে পারে না। আমার মনে হয় না CULA এখনও মাল্টি-নোড করে তবে এটি নজর রাখার মতো কিছু। CUBLAS একক নোড।

আমি আরও পরামর্শ দিচ্ছি যে আপনি নিজেই সমান্তরালতা বাস্তবায়নের জন্য দৃ strongly়তার সাথে বিবেচনা করুন, বিশেষত যদি আপনি এমপিআইয়ের সাথে পরিচিত হন এবং এটি কোনও বিদ্যমান কোড-বেসে প্রবেশ করতে পারেন। এইভাবে, আপনি সিপিইউ এবং জিপিইউ বিএলএএসের মধ্যে সহজেই স্যুইচ করতে পারেন এবং ঠিক যেখানে চান সেখানে ডেটা দিয়ে শুরু এবং শেষ করতে পারেন। আপনার কয়েকটি এমপিআই_এলএলআরডিইউএস কলের বেশি হওয়া উচিত নয় ।


আপনার বিশ্লেষণ এবং প্রাসঙ্গিক বিএলএএস কার্যাদি তালিকার জন্য আপনাকে ধন্যবাদ। আপনার উত্তরটি পড়ার পরে আমি এগুলি সাইল্যাবের বিকাশ সংস্করণে (www.scilab.org) কোভেরিয়েন্স ম্যাট্রিক্সের গণনাটি ত্বরান্বিত ও অনুকূলকরণের জন্য ব্যবহার করেছি।
স্টাফেন মোটলেট 13

যাইহোক, সতর্কতা অবলম্বন করুন যে covariance গণনা করার এই উপায় ব্যবহার করা যখন বিপর্যয়কর বাতিল হতে পারে E[xi,xj] নিকটবর্তী E[xi]E[xj]যেমন দেখতে en.wikipedia.org/wiki/...
Stéphane Mottelet

1

আমি কিউব্লাস এবং চুদা থ্রাস্টের সাথে @ ম্যাক্স হাচিনসন প্রদত্ত সূত্রটি প্রয়োগ করেছি এবং অনলাইন সহ বৈচিত্র্য গণনা সরঞ্জামগুলির সাথে তুলনা করছি। এটা আমার ভাল ফলাফল উত্পাদন বলে মনে হচ্ছে। নীচের কোডটি কিউডিএ বেয়েসকে পরিকল্পনা করেছে। সুতরাং প্রদত্ত ম্যাট্রিক্সে একাধিক শ্রেণি থাকতে পারে। সুতরাং একাধিক কো বৈকল্পিক ম্যাট্রিক্স গণনা করা হয়। আমি আশা করি এটি কারও কাজে লাগবে।

//! Calculates one or more than one coVarianceMatrix given data.
//  There can be many classes since many covariance matrixes.
/*!
    \param inMatrix This vector contains matrix data in major storage. 
    Forexample if inMatrix=[1 2 3 4 5 6] and trialSizes=[2] this means matrix we will work on a matrix like :
        |1 4 |
        |2 5 |
        |3 6 | -> 2 Trials, 3 Features. Columns contains feature rows contains trials (samples)
    \param trialSizes There can be many classes since many covariance matrixes. Samples from all classes will be given with inMatrix.
    But we need to know how many trials(samples) we have for each class. 
    For example if inMatrix=[1 2 3 4 5 6 7 8 9 10 11 12] and trialSizes=[2,2] 
    this means matrix we will work on a matrix like :
        |1 4 |  |7 10 |
        |2 5 |  |8 11 |
        |3 6 |  |9 12 |  --> Total number of trials(samples which is total rowCount) 2 + 2 = 4 , 
                             So colSize = inMatrix.size()/4 = 3(feature vector size)
                         --> There is two element in trialSize vec so each vector has to samples
*/
void multiQDACovianceCalculator(std::vector<float>& inMatrix, std::vector<int>& trialSizes)
{
    cublasHandle_t handle; // CUBLAS context
    int classCount = trialSizes.size();
    int rowSize = std::accumulate(trialSizes.begin(), trialSizes.end(), 0);
    int dimensionSize = inMatrix.size() / rowSize;
    float alpha = 1.0f;
    float beta = 0.0f; // bet =1

    thrust::device_vector<float> d_cov1(dimensionSize * dimensionSize);
    thrust::device_vector<float> d_cov2(dimensionSize * dimensionSize);
    thrust::device_vector<float> d_covResult(dimensionSize * dimensionSize);

    thrust::device_vector<float> d_wholeMatrix(inMatrix);
    thrust::device_vector<float> d_meansVec(dimensionSize); // rowVec of means of trials
    float *meanVecPtr = thrust::raw_pointer_cast(d_meansVec.data());
    float *device2DMatrixPtr = thrust::raw_pointer_cast(d_wholeMatrix.data());
    auto maxTrialNumber = *std::max_element(trialSizes.begin(), trialSizes.end());
    thrust::device_vector<float> deviceVector(maxTrialNumber, 1.0f);

    cublasCreate(&handle);
    // Inside of for loop  one covariance matrix calculated each time
    for (int i = 0; i < trialSizes.size(); i++)
    {
        // X*transpose(X) / N
        alpha = 1.0f / trialSizes[i];
        cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_T, dimensionSize, dimensionSize, trialSizes[i], &alpha,
            device2DMatrixPtr, dimensionSize, device2DMatrixPtr, dimensionSize, &beta,
            thrust::raw_pointer_cast(d_cov1.data()), dimensionSize);

        // Mean vector of each column
        alpha = 1.0f;
        cublasSgemv(handle, CUBLAS_OP_N, dimensionSize, trialSizes[i], &alpha, device2DMatrixPtr,
            dimensionSize, thrust::raw_pointer_cast(deviceVector.data()), 1, &beta, meanVecPtr, 1);

        // MeanVec * transpose(MeanVec) / N*N
        alpha = 1.0f / (trialSizes[i] * trialSizes[i]);
        cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_N, dimensionSize, dimensionSize, 1, &alpha,
            meanVecPtr, 1, meanVecPtr, 1, &beta,
            thrust::raw_pointer_cast(d_cov2.data()), dimensionSize);

        alpha = 1.0f;
        beta = -1.0f;
        //  (X*transpose(X) / N) -  (MeanVec * transpose(MeanVec) / N*N)
        cublasSgeam(handle, CUBLAS_OP_N, CUBLAS_OP_N, dimensionSize, dimensionSize, &alpha,
            thrust::raw_pointer_cast(d_cov1.data()), dimensionSize, &beta, thrust::raw_pointer_cast(d_cov2.data()), 
            dimensionSize, thrust::raw_pointer_cast(d_covResult.data()), dimensionSize);

        // Go to other class and calculate its covarianceMatrix
        device2DMatrixPtr += trialSizes[i] * dimensionSize;
    }
    printVector(d_covResult);
    cublasDestroy(handle);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.