मुझे एक पदानुक्रमित सॉफ्टमैक्स मॉडल को लागू करने में दिलचस्पी है जो 10 एम कक्षाओं के क्रम पर बड़े शब्दावली को संभाल सकता है। बड़े वर्ग की गणना और कुशल दोनों के लिए स्केलेबल दोनों के लिए ऐसा करने का सबसे अच्छा तरीका क्या है? उदाहरण के लिए, कम से कम one paper दिखाया गया है कि 2-स्तरीय पेड़ का उपयोग करते समय एचएस बड़े vocabs के लिए ~ 25x स्पीडअप प्राप्त कर सकता है जहां प्रत्येक नोड sqrt(N)
कक्षाएं। मैं एक मनमानी गहराई के पेड़ के लिए एक मनमाना शाखा के कारक के साथ एक और सामान्य संस्करण में भी रूचि रखता हूं।टेन्सफोर्लो में स्केलेबल, कुशल पदानुक्रमित सॉफ्टमैक्स?
1) हर बैच, जहां हम सूचकांक और विभाजन इकट्ठा के लिए भागो tf.gather
:
वहाँ कुछ ही विकल्प है कि मैं यहाँ देख रहे हैं। इससे बड़े बैच आकार और वसा वाले पेड़ों के साथ समस्याएं पैदा होती हैं जहां अब गुणांक को बहुत अधिक डुप्लिकेट किया जा रहा है, जिससे ओओएम त्रुटियां होती हैं।
2) # 1 के समान, हम tf.embedding_lookup
का उपयोग कर सकते हैं जो ओओएम त्रुटियों के साथ मदद करेगा लेकिन अब सब कुछ सीपीयू पर रखता है और चीजों को धीमा कर देता है।
3) प्रत्येक नमूना को अलग से संसाधित करने के लिए parallel_iterations=1
के साथ tf.map_fn
का उपयोग करें और एकत्रित करने के लिए वापस जाएं। यह बहुत अधिक स्केलेबल है लेकिन धारावाहिकरण के कारण वास्तव में 25x स्पीडअप के करीब नहीं आता है।
क्या एचएस लागू करने का कोई बेहतर तरीका है? गहरे और संकीर्ण बनाम छोटे और चौड़े पेड़ के लिए अलग-अलग तरीके हैं? काफ़ी नीचे
लेकिन अब CPU पर सब कुछ रहता है और धीमा कर देती चीजों
और 300 यूनिट छिपा आकार का उपयोग करना चाहते हैं और:
वे कार्य के आधार पर भिन्न होते हैं। भाषा मॉडल के चारों ओर छिपे हुए आकार के साथ 400 के आसपास बड़े बैचों हैं; अन्य कार्यों में छोटे बैच आकार और बड़े छिपे हुए आकार हो सकते हैं, जैसे कल्पना वर्गीकरण। वीआरएएम और रैम समस्या से काफी बड़े हैं (हालांकि जीपीयू रैम नहीं है)। –
क्या मैं टेन्सफोर्लो में आपके एचएस कार्यान्वयन को देख सकता हूं? मुझे वर्तमान में भी इसकी आवश्यकता है। –
यह थोड़ा गन्दा है, लेकिन यहां देखें: https://github.com/tansey/sdp/blob/87e701c9b0ff3eacab29713cb2c9e7181d5c26aa/tfsdp/models.py#L205 - पीछे की ओर, मैं pytorch या किसी अन्य गतिशील ग्राफ ढांचे का उपयोग करने का सुझाव दूंगा। –