Использование нескольких графических процессоров (CNTK) с C ++ cntk - PullRequest
0 голосов
/ 06 января 2019

Я использую библиотеку CNTK для изучения LSTM на одном CPU или GPU. Я не понимаю, как изменить свой код и запустить обучение на нескольких графических процессорах (CPU). Мой текущий код:

labels = InputVariable({ numOutputClasses }, DataType::Float, L"labels");
trainingLoss = CrossEntropyWithSoftmax(lstmModel, labels, 
L"lossFunction");
prediction   = CrossEntropyWithSoftmax(lstmModel, labels, 
L"classificationError");

//create learner 
paramLearner = AdamLearner(lstmModel->Parameters(),
                          learningRate,
                                momentumSchedule, 
                                false);

//create trainer
trainer = CreateTrainer(lstmModel, trainingLoss, prediction, vector<LearnerPtr>({ paramLearner }));

sampleShape = { inputDim };
labelsShape = { numOutputClasses };

classifierOutputVar = lstmModel->Output();
unordered_map<Variable, ValuePtr> argumentsOut;
double trainLossValue;

// run train
for (size_t i = 1; i <= countEpoch; ++i)
{
    cout << "Epoch " << i << ":" << countEpoch << endl;

    for (int k = 0; k < inputData.size(); ++k) 
    {
        argumentsOut = { { classifierOutputVar, outputValue },
                         { prediction, predictionErrorValue } };

        featuresValue = Value::Create(sampleShape, inputData.at(k),  device);
        labelValue    = Value::Create(labelsShape, labelsData.at(k), device);
        argumentsIn = { { features, featuresValue }, { labels, labelValue } };

        trainer->TrainMinibatch(argumentsIn, true, argumentsOut, device);
        argumentsIn.clear();

        trainLossValue = trainer->PreviousMinibatchLossAverage();
        cout << "\tBatch " << k + 1 << ":" << inputData.size() << "\ttrainLossValueBatch: " << trainLossValue << endl;
    }

    saveModel(path);        
}

Попытки выяснить это самостоятельно провалились:

auto sync = MPICommunicator();

auto numWorkers = sync->Workers().size();
auto workerRank = sync->CurrentWorker().m_globalRank;

labels = InputVariable({ numOutputClasses }, DataType::Float, L"labels");
trainingLoss = CrossEntropyWithSoftmax(lstmModel, labels, L"lossFunction");
prediction = ClassificationError(lstmModel, labels, L"classificationError");

paramLearner = FSAdaGradLearner(lstmModel->Parameters(),
                                learningRate,
                                momentumSchedule,
                                false);

DistributedLearnerPtr distributedLearner =
    CreateDataParallelDistributedLearner(MPICommunicator(), paramLearner, 0);

trainer = CreateTrainer(lstmModel, trainingLoss, prediction, { distributedLearner });

Не понятно, как работать на нескольких GPU (CPU) ... Я понимаю, что вам нужно создать MinibatchSource с использованием CreateCompositeMinibatchSource, просто не ясно, как создать объект MinibatchSourceConfig с использованием массива или контейнера последовательности MFCC.

...