class_docstr: Testing DistributedHistory with multiprocessing
  
  This is not a proper test for how DistributedHistory should be used in the
  wild, which would be in a multi-GPU setting using DDP (possibly through
  accelerate). However, since we cannot test this setting in CI, this is the
  next best approximation.
  
  Since DDP creates forks of the main process, each one would have its own
  history instance, leading in them diverging. This can be bad, e.g. if the
  history is used to steer the training (think early stopping). This test
  intends to show that the histories do not diverge.
  
  In a sense, this test actually tests incorrect behavior because the
  different processes all write the exact same content to the history.
  However, if DDP was used, each process would see different batches and thus
  write different records to their histories. So when reading this test,
  imagine that this would be what's truly happening.
  
  This test is very high level, unlike TestHistory. For instance, there is no
  attempt at testing "weird" read and write patterns, like creating multiple
  empty batches. It is very much assumed that the history is used "correctly",
  as in a normal skorch fit loop.
class_docstr_tok: ["Testing","DistributedHistory","with","multiprocessing","This","is","not","a","proper","test","for","how","DistributedHistory","should","be","used","in","the","wild",",","which","would","be","in","a","multi-GPU","setting","using","DDP","(","possibly","through","accelerate",")",".","However",",","since","we","can","not","test","this","setting","in","CI",",","this","is","the","next","best","approximation",".","Since","DDP","creates","forks","of","the","main","process",",","each","one","would","have","its","own","history","instance",",","leading","in","them","diverging",".","This","can","be","bad",",","e.g",".","if","the","history","is","used","to","steer","the","training","(","think","early","stopping",")",".","This","test","intends","to","show","that","the","histories","do","not","diverge",".","In","a","sense",",","this","test","actually","tests","incorrect","behavior","because","the","different","processes","all","write","the","exact","same","content","to","the","history",".","However",",","if","DDP","was","used",",","each","process","would","see","different","batches","and","thus","write","different","records","to","their","histories",".","So","when","reading","this","test",",","imagine","that","this","would","be","what","'s","truly","happening",".","This","test","is","very","high","level",",","unlike","TestHistory",".","For","instance",",","there","is","no","attempt","at","testing","``","weird","''","read","and","write","patterns",",","like","creating","multiple","empty","batches",".","It","is","very","much","assumed","that","the","history","is","used","``","correctly","''",",","as","in","a","normal","skorch","fit","loop","."]
code: def data(self, classifier_data):
      X, y = classifier_data
      return X[:100], y[:100]
  
imports: import pickle
  import time
  import multiprocessing
  from functools import partial
  import numpy
  import pytest
  import torch
  from torch.distributed import TCPStore
  from sklearn.datasets import make_classification
label_desc: Use image node_id 1 for calling the TestDistributedHistoryMultiprocessing obj's underlying member method code with example usage: obj.data(classifier_data) and returns: X,  y