apache spark - भविष्य के उपयोग के लिए एमएल मॉडल सहेजें




apache-spark pyspark (2)

मैं कुछ मशीन लर्निंग एल्गोरिदम जैसे रैखिक प्रतिगमन, लॉजिस्टिक रिग्रेशन और नैवे बे को कुछ डेटा में लागू कर रहा था, लेकिन मैं आरडीडी का उपयोग करने से बचने और डेटाफ्रैम का उपयोग शुरू करने की कोशिश कर रहा था, क्योंकि आरडीडी पीएसपीआरआर पर डेटाफ्रेम की तुलना में धीमे हैं (चित्र 1 देखें)।

अन्य कारण जो मैं DataFrames का उपयोग कर रहा हूं, क्योंकि एमएल लाइब्रेरी में ट्यून मॉडल के लिए बहुत उपयोगी एक वर्ग है जो कि CrossValidator यह वर्ग इसे फिट करने के बाद एक मॉडल लौटाता है, जाहिर है इस पद्धति को कई परिदृश्यों का परीक्षण करना पड़ता है, और उसके बाद एक फिट मॉडल लौटाता है ( मापदंडों के सर्वोत्तम संयोजन के साथ)।

मैं जिस क्लस्टर का उपयोग करता हूं वह इतना बड़ा नहीं है और डेटा बहुत बड़ा है और कुछ फिटिंग में घंटों लगते हैं इसलिए मैं इस मॉडल को बाद में पुन: उपयोग करने के लिए सहेजना चाहता हूं, लेकिन मुझे यह महसूस नहीं हुआ कि कैसे, कुछ ऐसा है जिसे मैं अनदेखा कर रहा हूं?

टिप्पणियाँ:

  • Mllib के मॉडल वर्गों में एक बचत विधि ( NaiveBayes ) है, लेकिन mllib में CrossValidator नहीं है और RDDs का उपयोग करें इसलिए मैं इसे पूर्व-निर्धारित समय से बचा रहा हूं।
  • वर्तमान संस्करण 1.5.1 स्पार्क है।

स्पार्क 2.0.0+

पहली नज़र में सभी Transformers और Estimators निम्नलिखित इंटरफ़ेस के साथ MLWritable को लागू MLWritable :

def write: MLWriter
def save(path: String): Unit 

और निम्नलिखित इंटरफ़ेस के साथ MLReadable

def read: MLReader[T]
def load(path: String): T

इसका मतलब है कि आप डिस्क से मॉडल लिखने के लिए save मेथड का उपयोग कर सकते हैं, उदाहरण के लिए

import org.apache.spark.ml.PipelineModel

val model: PipelineModel
model.save("/path/to/model")

और इसे बाद में पढ़ें:

val reloadedModel: PipelineModel = PipelineModel.load("/path/to/model")

PyWark में MLWritable / JavaMLWritable और MLReadable / JavaMLReadable क्रमशः समतुल्य विधियां लागू की JavaMLReadable हैं:

from pyspark.ml import Pipeline, PipelineModel

model = Pipeline(...).fit(df)
model.save("/path/to/model")

reloaded_model = PipelineModel.load("/path/to/model")

SparkR write.ml / read.ml फ़ंक्शन प्रदान करता है, लेकिन आज के रूप में, ये अन्य समर्थित भाषाओं के साथ संगत नहीं हैं - SPARK-15572

ध्यान दें कि लोडर वर्ग को संग्रहित PipelineStage के वर्ग से मेल खाना है। उदाहरण के लिए यदि आपने LogisticRegressionModel बचाया है तो आपको LogisticRegressionModel उपयोग करना चाहिए न कि LogisticRegression.load

यदि आप स्पार्क <= 1.6.0 का उपयोग करते हैं और मॉडल की बचत के साथ कुछ मुद्दों का अनुभव करते हैं तो मैं स्विचिंग संस्करण का सुझाव दूंगा।

स्पार्क विशिष्ट तरीकों के अतिरिक्त स्पार्क एमएल मॉडल को बचाने और लोड करने के लिए डिज़ाइन किए गए पुस्तकालयों की संख्या बढ़ रही है। उदाहरण के लिए देखें स्पार्क एमएललिब मॉडल की सेवा कैसे करें? ।

स्पार्क> = 1.6

स्पार्क 1.6 के बाद से यह संभव है कि आप अपने मॉडल को save विधि का उपयोग करके save । क्योंकि लगभग हर model MLWritable इंटरफ़ेस को लागू करता है। उदाहरण के लिए, LinearRegressionModel पास यह है, और इसलिए इसका उपयोग करके अपने मॉडल को वांछित पथ पर सहेजना संभव है।

स्पार्क <1.6

मेरा मानना ​​है कि आप यहाँ गलत धारणाएँ बना रहे हैं।

एक DataFrames पर कुछ संचालन अनुकूलित किया जा सकता है और यह सादे RDDs की तुलना में बेहतर प्रदर्शन के लिए अनुवाद करता है। DataFrames कुशल कैशिंग प्रदान करता है और SQLD API यकीनन RDD API की तुलना में आसान है।

ML पाइपलाइन अत्यंत उपयोगी हैं और क्रॉस-वैल्यूएटर या विभिन्न मूल्यांकनकर्ताओं जैसे उपकरण किसी भी मशीन पाइपलाइन में बस होने चाहिए और भले ही उपरोक्त में से कोई भी विशेष रूप से कठिन न हो, निम्न स्तर के MLLib एपीआई के शीर्ष पर लागू होता है, जिसके लिए तैयार होना बहुत बेहतर है उपयोग, सार्वभौमिक और अपेक्षाकृत अच्छी तरह से परीक्षण किया गया समाधान।

अब तक अच्छा है, लेकिन कुछ समस्याएं हैं:

  • जहाँ तक मैं एक DataFrames पर सरल संचालन बता सकता हूँ जैसे कि select या withColumn प्रदर्शन इसके RDD समतुल्य प्रदर्शन जैसे map
  • कुछ मामलों में एक ठेठ पाइपलाइन में स्तंभों की संख्या बढ़ रही है वास्तव में अच्छी तरह से कम स्तर के परिवर्तनों की तुलना में प्रदर्शन को नीचा दिखा सकते हैं। आप निश्चित रूप से उस के लिए सही करने के लिए रास्ते पर ड्रॉप-कॉलम-ट्रांसफार्मर जोड़ सकते हैं,
  • ml.classification.NaiveBayes सहित कई एमएल एल्गोरिदम बस अपने mllib एपीआई के आसपास रैपर हैं ,
  • PySpark ML / MLlib एल्गोरिदम अपने स्काला समकक्षों को वास्तविक प्रसंस्करण सौंपते हैं,
  • अंतिम लेकिन कम से कम RDD अभी भी बाहर नहीं है, भले ही DataFrame API के पीछे छिपा हो

मेरा मानना ​​है कि दिन के अंत में MLLib पर ML का उपयोग करके आपको जो मिलता है वह काफी सुरुचिपूर्ण, उच्च स्तरीय एपीआई है। कस्टम मल्टी-स्टेप पाइपलाइन बनाने के लिए आप दोनों को एक चीज मिला सकते हैं:

  • डेटा लोड करने, साफ़ करने और बदलने के लिए ML का उपयोग करें,
  • आवश्यक डेटा निकालें (उदाहरण के लिए extractLabeledPoints विधि देखें) और MLLib एल्गोरिथ्म में पास करें,
  • कस्टम क्रॉस-मान्यता / मूल्यांकन जोड़ें
  • अपनी पसंद की विधि का उपयोग करके MLLib मॉडल को MLLib (स्पार्क मॉडल या PMML )

यह एक इष्टतम समाधान नहीं है, लेकिन सबसे अच्छा है जिसे मैं वर्तमान एपीआई के बारे में सोच सकता हूं।


ऐसा लगता है जैसे किसी मॉडल को बचाने के लिए एपीआई कार्यक्षमता आज के रूप में लागू नहीं की गई है ( स्पार्क समस्या ट्रैकर SPARK-6725 देखें )।

एक विकल्प पोस्ट किया गया था ( एमएल पाइपलाइन से मॉडल को एस 3 या एचडीएफएस में कैसे बचाया जाए? ) जिसमें केवल मॉडल को क्रमबद्ध करना शामिल है, लेकिन एक जावा दृष्टिकोण है। मुझे उम्मीद है कि PySpark में आप कुछ ऐसा ही कर सकते हैं, यानी डिस्क पर लिखने के लिए मॉडल का अचार।





apache-spark-ml