<पी> क्या आपने कभी कोई शानदार समय-श्रृंखला मॉडल बनाया है, जो बिक्री की भविष्यवाणी कर सकता है या स्टॉक की कीमतों की भविष्यवाणी कर सकता है, केवल वास्तविक दुनिया में इसे विफल होते देखने के लिए? ख़ैर, यह एक सामान्य निराशा है. आपका मॉडल आपकी मशीन पर पूरी तरह से काम करता है, लेकिन जैसे ही आप इसे डॉकर कंटेनर में तैनात करते हैं, यह भूलने की बीमारी विकसित करने लगता है। यह कल जो कुछ भी जानता था उसे भूल जाता है, जिससे आने वाले कल के लिए इसकी भविष्यवाणियाँ बेकार हो जाती हैं। <पी> चिंता मत करो. यह संभवतः आपके मॉडल में कोई दोष नहीं है. यह समय-श्रृंखला मॉडल और डॉकर कंटेनरों को काम करने के लिए डिज़ाइन किए जाने के बीच एक टकराव है। <पी> समय-श्रृंखला मॉडल सभी स्मृति के बारे में हैं। भविष्य की भविष्यवाणी करने के लिए उन्हें अतीत को याद रखना होगा। लेकिन डॉकर कंटेनरों को स्टेटलेस और भुलक्कड़ बनाने के लिए बनाया गया है, हर पुनरारंभ के साथ उनकी मेमोरी साफ हो जाती है। यह मूलभूत संघर्ष एक शक्तिशाली मॉडल को उत्पादन में बेकार मॉडल में बदल सकता है। <पी> इस लेख में, हम उस समस्या का समाधान करेंगे। हम आपके समय-श्रृंखला मॉडल को एक स्थायी स्मृति देने जा रहे हैं। आप सीखेंगे कि एक उत्पादन-तैयार भविष्यवाणी सेवा कैसे बनाई जाए जो बाहरी मस्तिष्क के रूप में रेडिस और डॉकर वॉल्यूम का उपयोग करती है ताकि यह सुनिश्चित हो सके कि मेमोरी किसी भी पुनरारंभ से बची रहे। हम चरण-दर-चरण उदाहरण के माध्यम से चलेंगे, ताकि आप सीख सकें कि एक ऐसी प्रणाली कैसे बनाई जाए जो बुद्धिमान और अविश्वसनीय रूप से विश्वसनीय हो। हम क्या कवर करेंगे:
- <पी> यह मार्गदर्शिका किसके लिए है?
- <पी> समस्या को समझना
- <पी> तो, समय-श्रृंखला मॉडल क्या है?
- <पी> 1. कंटेनर डिज़ाइन के अनुसार अल्पकालिक होते हैं
- <पी> 2. भविष्यवाणियों के बीच खोया हुआ संदर्भ
- <पी> 3. पुनरारंभ पर मॉडल भूलने की बीमारी
- <पी> समाधान:बाहरी राज्य स्टोर
- <पी> हाथों-हाथ कार्यान्वयन
- <पी> टूटे हुए दृष्टिकोण से शुरुआत करें
- <पी> वॉल्यूम के साथ इसे कैसे ठीक करें
- <पी> कोड स्थिति को कैसे संभालता है
- <पी> स्वास्थ्य समापन बिंदु का परीक्षण करें
- <पी> स्केलिंग के बारे में क्या?
- <पी> रेडिस क्लस्टर के साथ क्षैतिज स्केलिंग
- <पी> रेडिस सेंटिनल के साथ उच्च उपलब्धता
- <पी> प्रबंधित रेडिस सेवाओं का उपयोग करें
- <पी> बचने के लिए सामान्य नुकसान
- <पी> यह मत मानिए कि वॉल्यूम काम करता है
- <पी> रेडिस मेमोरी सीमाओं को नजरअंदाज न करें
- <पी> निगरानी न छोड़ें
- <पी> निष्कर्ष
यह मार्गदर्शिका किसके लिए है?
<पी> इस ट्यूटोरियल का अधिकतम लाभ उठाने के लिए, कुछ चीज़ों को ध्यान में रखना मददगार होगा। हम कुछ कोड और कमांड-लाइन कार्य में गोता लगाएंगे, इसलिए थोड़ी सी तैयारी बहुत काम आएगी। - <पी> इस प्रोजेक्ट के मुख्य उपकरण डॉकर और डॉकर कंपोज़ हैं। सुनिश्चित करें कि आपने उन्हें अपने कंप्यूटर पर इंस्टॉल और चालू कर लिया है।
- <पी> यदि आप डॉकर, पायथन और फ्लास्क वेब फ्रेमवर्क की बुनियादी बातों से सहज हैं तो आपके लिए इसका पालन करना भी आसान हो जाएगा। ट्यूटोरियल में कमांड चलाने के लिए कमांड-लाइन का थोड़ा अनुभव भी उपयोगी होगा।
- <पी> लेकिन अगर आपने पहले कभी रेडिस का उपयोग नहीं किया है तो चिंता न करें। आपको बस इतना जानना है कि यह एक तेज़, इन-मेमोरी डेटाबेस है। बाकी काम हम रास्ते में संभाल लेंगे।
<पी> इसे एक निर्देशित दौरे के रूप में सोचें। जब तक आप उत्सुक हैं और बुनियादी उपकरण तैयार हैं, तब तक आप अच्छी स्थिति में रहेंगे। समस्या को समझना
<पी> समाधान में कूदने से पहले, आइए पहले स्पष्ट करें कि समय-श्रृंखला मॉडल क्या है और फिर पता लगाएं कि इसे कंटेनरीकृत करना इतना मुश्किल क्यों है। तो, समय-श्रृंखला मॉडल क्या है?
<पी> सीधे शब्दों में कहें तो, समय-श्रृंखला मॉडल एक प्रकार का मॉडल है जो भविष्य के मूल्यों की भविष्यवाणी करने के लिए समय के साथ एकत्र किए गए डेटा बिंदुओं का विश्लेषण करता है। इसे मौसम की भविष्यवाणी करने जैसा समझें। एक मौसम विज्ञानी अभी केवल आकाश की ओर नहीं देखता। कल क्या होगा इसकी भविष्यवाणी करने के लिए वे पिछले कुछ घंटों और दिनों के तापमान, दबाव और हवा के पैटर्न को देखते हैं। <पी> टाइम-सीरीज़ मॉडल डेटा के साथ वही काम करते हैं, चाहे वह वेबसाइट ट्रैफ़िक हो, स्टॉक की कीमतें हों, या ऊर्जा खपत हो। मुख्य बात यह है कि इतिहास मायने रखता है। अतीत की घटनाओं का क्रम भविष्य के बारे में एक बुद्धिमान भविष्यवाणी करने के लिए आवश्यक संदर्भ प्रदान करता है। <पी> अब, जब आप इन मॉडलों को डॉकर में डालते हैं तो क्या टूटता है। 1. कंटेनर डिज़ाइन की दृष्टि से अल्पकालिक होते हैं
<पी> डॉकर कंटेनरों को स्टेटलेस माना जाता है। यह अधिकांश एपीआई के लिए बढ़िया काम करता है। एक उपयोगकर्ता प्रोफ़ाइल समापन बिंदु? राज्यविहीन. एक भावना विश्लेषण मॉडल? राज्यविहीन. वे एक इनपुट लेते हैं, एक आउटपुट लौटाते हैं, और बीच में सब कुछ भूल जाते हैं। <पी> समय-श्रृंखला मॉडल इस तरह से काम नहीं करते हैं। उन्हें पिछली भविष्यवाणियों से संदर्भ की आवश्यकता है। इसके बिना, आपका मॉडल अनिवार्य रूप से अंधा है। 2. भविष्यवाणियों के बीच संदर्भ खो गया
<पी> प्रत्येक भविष्यवाणी अलगाव में होती है। आपका मॉडल एक एकल डेटा बिंदु प्राप्त करता है और यह जाने बिना कि पहले क्या आया था, अनुमान लगाता है। यह समय-श्रृंखला मॉडलिंग के संपूर्ण उद्देश्य को विफल कर देता है। <पी> आप सोच सकते हैं:"मैं हर अनुरोध पर सारा ऐतिहासिक डेटा लोड कर दूंगा।" लेकिन वह दृष्टिकोण दो कारणों से विफल हो जाता है: - <पी> यह धीमा है. यदि आपके पास हजारों डेटा पॉइंट हैं तो यह वास्तव में धीमा है
- <पी> इसका पैमाना नहीं है. जब आपके पास एकाधिक श्रृंखला या उच्च अनुरोध मात्रा होती है, तो आप तेजी से प्रदर्शन स्तर तक पहुंच जाएंगे
3. पुनरारंभ पर मॉडल भूलने की बीमारी
<पी> हर बार जब आप कोई नया संस्करण तैनात करते हैं या कंटेनर क्रैश हो जाता है, तो सभी संचित स्थिति गायब हो जाती है। आपका मॉडल शून्य से शुरू होता है. उत्पादन में, यह अस्वीकार्य है। समाधान:बाहरी राज्य स्टोर
<पी> राज्य को कंटेनर के अंदर रखने के बजाय, हम इसे बाहर ले जाएंगे। रेडिस मॉडल की स्मृति बन जाता है। <पी> पैटर्न इस तरह दिखता है: Client Request → Flask API → Redis → Prediction with Context
<पी> आपका कंटेनर स्टेटलेस और बदलने योग्य रहता है। लेकिन संपूर्ण सिस्टम रेडिस के माध्यम से स्थिति बनाए रखता है। हैंड-ऑन कार्यान्वयन
<पी> आइए इसे बनाएं. डेमो रिपॉजिटरी को क्लोन करें: git clone https://github.com/ag-chirag/docker-redis-time-series
cd docker-redis-time-series
टूटे हुए दृष्टिकोण से शुरुआत करें
<पी> docker-compose.initial.yml फ़ाइल दिखाती है कि क्या नहीं करना है: services:
api:
build: ./flask-api
ports:
- "5000:5000"
redis:
image: redis:alpine
<पी> ध्यान दें क्या कमी है? कोई वॉल्यूम नहीं. Redis कंटेनर के फ़ाइल सिस्टम में डेटा संग्रहीत करता है, जिसका अर्थ है कि डेटा अस्थायी है। <पी> इसे चलाएँ: docker compose -f docker-compose.initial.yml up
<पी> कुछ भविष्यवाणियाँ करें: curl -X POST http://localhost:5000/predict \
-H "Content-Type: application/json" \
-d '{
"series_id": "demo",
"historical_data": [
{"timestamp": "2024-01-01T12:00:00", "value": 10},
{"timestamp": "2024-01-01T12:01:00", "value": 20},
{"timestamp": "2024-01-01T12:02:00", "value": 30}
]
}'
<पी> आपको एक प्रतिक्रिया मिलेगी जिसमें दिखाया जाएगा कि रेडिस काम कर रहा है: {
"data_points_used": 3,
"prediction": 40,
"redis_connected": true
}
<पी> अब सेवाएँ पुनः प्रारंभ करें: docker compose down
docker compose -f docker-compose.initial.yml up
<पी> एक और भविष्यवाणी करें. data_points_used की जाँच करें फ़ील्ड. यह रीसेट हो गया. आपका सारा ऐतिहासिक डेटा ख़त्म हो गया है. यह बिल्कुल वही है जिससे हम बचने की कोशिश कर रहे हैं। वॉल्यूम के साथ इसे कैसे ठीक करें
<पी> सही docker-compose.yml दृढ़ता जोड़ता है: services:
api:
build: ./flask-api
ports:
- "5000:5000"
environment:
- REDIS_HOST=redis
redis:
image: redis:alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
redis_data:
तो, वॉल्यूम क्या है और यह कैसे काम करता है?
<पी> डॉकर वॉल्यूम को अपने कंटेनर के लिए एक समर्पित बाहरी हार्ड ड्राइव के रूप में सोचें। डिफ़ॉल्ट रूप से, जब कोई कंटेनर डेटा लिखता है, तो यह एक अस्थायी परत पर ऐसा करता है जो कंटेनर हटाए जाने पर नष्ट हो जाती है। वॉल्यूम उस डेटा को स्थायी रूप से सहेजने का एक तरीका प्रदान करता है। <पी> यहां बताया गया है कि यह कैसे काम करता है: - <पी> डॉकर होस्ट मशीन पर एक विशेष भंडारण क्षेत्र बनाता है और प्रबंधित करता है, जो किसी भी कंटेनर के फाइल सिस्टम से पूरी तरह से अलग होता है। हमारे docker-compose.yml में,
volumes: redis_data: नीचे का अनुभाग डॉकर को redis_data नामक नामित वॉल्यूम बनाने के लिए कहता है .
- <पी> जब Redis कंटेनर प्रारंभ होता है, तो
volumes: - redis_data:/data लाइन डॉकर को इस बाहरी हार्ड ड्राइव को "प्लग इन" करने के लिए कहती है। यह redis_data को जोड़ता है वॉल्यूम /data पर कंटेनर के अंदर निर्देशिका.
- <पी> अब, जब भी कंटेनर के अंदर रेडिस प्रक्रिया अपने
/data पर डेटा लिखती है निर्देशिका (जिसे हमने इसे करने के लिए कॉन्फ़िगर किया है), यह वास्तव में redis_data पर लिख रही है होस्ट मशीन पर वॉल्यूम.
- <पी> जब आप डॉकर कंपोज़ डाउन चलाते हैं, तो रेडिस कंटेनर नष्ट हो जाता है, लेकिन
redis_data वॉल्यूम अछूता है. यह बाहरी हार्ड ड्राइव को अनप्लग करने जैसा है, और डेटा अभी भी सुरक्षित है। अगली बार जब आप डॉकर कंपोज़ अप चलाते हैं, तो एक बिल्कुल नया रेडिस कंटेनर बनाया जाता है, वॉल्यूम फिर से जोड़ा जाता है, और रेडिस को अपना सारा पुराना डेटा वहीं मिल जाता है जहां उसने इसे छोड़ा था।
<पी> यह तंत्र हमारी स्टेटफुल सेवा को पुनः आरंभ होने वाली मेमोरी देने की कुंजी है। <पी> संशोधित संस्करण चलाएँ: docker compose up --build
<पी> स्थिति बनाने के लिए कई भविष्यवाणियाँ भेजें: for i in {1..5}; do
curl -X POST http://localhost:5000/predict \
-H "Content-Type: application/json" \
-d "{
\"series_id\": \"demo\",
\"historical_data\": [{\"timestamp\": \"2024-01-01T12:0$i:00\", \"value\": $((i*10))}]
}"
done
<पी> अब परीक्षा आती है. सब कुछ पुनः आरंभ करें: docker compose down
docker compose up
<पी> एक और भविष्यवाणी करें. data_points_used को देखें . इसमें पिछले सभी बिंदु शामिल हैं. मॉडल वहीं से शुरू करता है जहां उसने छोड़ा था। <पी> यह काम करता है क्योंकि वॉल्यूम कंटेनर जीवनचक्र से स्वतंत्र रूप से मौजूद होता है। कोड स्थिति को कैसे संभालता है
<पी> flask-api/app.py में फ्लास्क एपीआई क्रमबद्ध सेट का उपयोग करके रेडिस में प्रत्येक डेटा बिंदु को संग्रहीत करता है: def store_data_point(series_id, timestamp, value):
key = f"ts:{series_id}"
redis_client.zadd(key, {json.dumps({"ts": timestamp, "val": value}): timestamp})
<पी> भविष्यवाणियाँ करते समय, यह हाल का इतिहास पुनः प्राप्त करता है: def get_recent_data(series_id, limit=100):
key = f"ts:{series_id}"
data = redis_client.zrange(key, -limit, -1)
return [json.loads(d) for d in data]
<पी> रेडिस द्वारा सॉर्ट किए गए सेट आपको स्वचालित समय ऑर्डरिंग देते हैं। वॉल्यूम सुनिश्चित करता है कि यह डेटा पुनः आरंभ होता रहे। स्वास्थ्य समापन बिंदु का परीक्षण करें
<पी> जांचें कि सब कुछ ठीक से जुड़ा हुआ है: curl http://localhost:5000/health
<पी> आपको देखना चाहिए: {
"model_loaded": true,
"redis_connected": true,
"status": "healthy"
}
<पी> यदि redis_connected गलत है, अपने डॉकर लॉग की जाँच करें। सामान्य समस्याएँ हैं नेटवर्क कॉन्फ़िगरेशन या रेडिस का ठीक से प्रारंभ न होना। स्केलिंग के बारे में क्या?
<पी> यह सेटअप सिंगल-इंस्टेंस परिनियोजन के लिए अच्छा काम करता है। जब ट्रैफ़िक बढ़ता है, तो आपके पास कुछ विकल्प होते हैं। रेडिस क्लस्टर के साथ क्षैतिज स्केलिंग
<पी> उच्च थ्रूपुट के लिए, अपने डेटा को कई रेडिस नोड्स में वितरित करें। रेडिस क्लस्टर स्वचालित रूप से शार्डिंग को संभालता है। रेडिस सेंटिनल के साथ उच्च उपलब्धता
<पी> फ़ेलओवर क्षमता जोड़ें ताकि आपका राज्य स्टोर विफलता का एक भी बिंदु न बने। सेंटिनल रेडिस उदाहरणों की निगरानी करता है और प्राथमिक विफल होने पर प्रतिकृतियों को बढ़ावा देता है। प्रबंधित Redis सेवाओं का उपयोग करें
<पी> AWS ElastiCache, Redis के लिए Azure Cache, या Google Cloud Memorystore परिचालन बोझ को संभालते हैं। आप अपने मॉडल पर ध्यान केंद्रित करें, वे रेडिस की विश्वसनीयता को संभालते हैं। <पी> मुख्य अंतर्दृष्टि:आपके एपीआई कंटेनर स्टेटलेस रहते हैं। आप स्वतंत्र रूप से राज्य स्टोर का पैमाना बनाते हैं। सामान्य नुकसानों से बचना चाहिए
<पी> मैं इस पर पर्याप्त जोर नहीं दे सकता:उत्पादन में लगाने से पहले अपनी दृढ़ता का परीक्षण करें। यह न मानें कि वॉल्यूम काम करता है
<पी> वास्तव में अपने कंटेनरों को पुनः आरंभ करें और सत्यापित करें कि स्थिति बनी रहती है। मैंने देखा है कि परिनियोजन विफल हो गए क्योंकि कोई व्यक्ति उत्पादन में वॉल्यूम बढ़ाना भूल गया। रेडिस मेमोरी सीमाओं को नजरअंदाज न करें
<पी> रेडिस हर चीज़ को मेमोरी में रखता है। अपनी मेमोरी उपयोग की निगरानी करें. अपने कार्यभार के लिए उपयुक्त मैक्समेमोरी नीतियां निर्धारित करें। यदि आपकी मेमोरी ख़त्म हो जाती है, तो Redis कुंजियाँ निकालना शुरू कर देगा या लिखने से इंकार कर देगा। निगरानी न छोड़ें
<पी> स्वास्थ्य जांच जोड़ें. रेडिस कनेक्शन स्थिति की निगरानी करें। पूर्वानुमान विलंबता को ट्रैक करें. आप यह जानना चाहते हैं कि चीजें कब टूटती हैं, न कि क्रोधित उपयोगकर्ताओं से इसके बारे में सीखना चाहते हैं। निष्कर्ष
<पी> समय-श्रृंखला मॉडल को स्मृति की आवश्यकता होती है। डॉकर कंटेनर डिफ़ॉल्ट रूप से मेमोरी खो देते हैं। समाधान सरल है:गणना से राज्य को अलग करें। <पी> रेडिस को बाहरी राज्य स्टोर के रूप में उपयोग करें। उस स्थिति को बनाए रखने के लिए डॉकर वॉल्यूम का उपयोग करें। आपका मॉडल स्मार्ट रहता है, आपके कंटेनर बदले जाने योग्य रहते हैं, और आपकी तैनाती विश्वसनीय हो जाती है। <पी> पूरा कार्यशील कोड github.com/ag-chirag/docker-redis-time-series पर उपलब्ध है। इसे क्लोन करें, इसे चलाएं, इसे तोड़ें, इससे सीखें। <पी> और याद रखें:जो सबसे सरल समाधान काम करता है वह आमतौर पर सही होता है। आपको हमेशा Kubernetes और StatefulSets की आवश्यकता नहीं होती है। कभी-कभी डॉकर कंपोज़ और वॉल्यूम ही काफी होते हैं। <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें