কম্পিউটার টিউটোরিয়াল

অবিচ্ছিন্ন পূর্বাভাসের যথার্থতা নিশ্চিত করা:রেডিসের সাথে ডকারাইজড টাইম-সিরিজ মডেলগুলিতে স্থায়ী অবস্থা

অবিচ্ছিন্ন পূর্বাভাসের যথার্থতা নিশ্চিত করা:রেডিসের সাথে ডকারাইজড টাইম-সিরিজ মডেলগুলিতে স্থায়ী অবস্থা

আপনি কি কখনও একটি উজ্জ্বল টাইম-সিরিজ মডেল তৈরি করেছেন, যা বিক্রয়ের পূর্বাভাস দিতে পারে বা স্টকের দামের ভবিষ্যদ্বাণী করতে পারে, শুধুমাত্র এটি বাস্তব জগতে ব্যর্থ হতে দেখার জন্য? ঠিক আছে, এটি একটি সাধারণ হতাশা। আপনার মডেলটি আপনার মেশিনে নিখুঁতভাবে কাজ করে, কিন্তু যে মুহূর্তে আপনি এটিকে একটি ডকার কন্টেইনারে স্থাপন করেন, মনে হয় এটি স্মৃতিভ্রংশ বিকাশ করছে। এটি গতকাল যা জানত তা ভুলে যায়, আগামীকালের জন্য তার ভবিষ্যদ্বাণীগুলিকে অকেজো করে তোলে৷

চিন্তা করবেন না। এটি সম্ভবত আপনার মডেলের একটি ত্রুটি নয়। টাইম-সিরিজ মডেল এবং ডকার কন্টেইনারগুলি কীভাবে কাজ করার জন্য ডিজাইন করা হয়েছে তার মধ্যে এটি একটি সংঘর্ষ৷

টাইম-সিরিজ মডেল সব মেমরি সম্পর্কে. ভবিষ্যতের ভবিষ্যদ্বাণী করার জন্য তাদের অতীত মনে রাখতে হবে। কিন্তু ডকার কন্টেইনারগুলি রাষ্ট্রহীন এবং বিস্মৃত হওয়ার জন্য তৈরি করা হয়েছে, প্রতিটি পুনঃসূচনা করার সাথে তাদের স্মৃতি পরিষ্কার করে। এই মৌলিক দ্বন্দ্ব একটি শক্তিশালী মডেলকে উৎপাদনে একটি মূল্যহীন মডেলে পরিণত করতে পারে।

এই নিবন্ধে, আমরা সেই সমস্যাটি সমাধান করব। আমরা আপনার টাইম-সিরিজ মডেলটিকে একটি স্থায়ী স্মৃতি দিতে যাচ্ছি। আপনি শিখবেন কীভাবে একটি উত্পাদন-প্রস্তুত ভবিষ্যদ্বাণী পরিষেবা তৈরি করতে হয় যা রেডিসকে একটি বাহ্যিক মস্তিষ্ক এবং ডকার ভলিউম হিসাবে ব্যবহার করে যাতে মেমরি যে কোনও পুনঃসূচনা বেঁচে থাকে তা নিশ্চিত করতে। আমরা ধাপে ধাপে একটি হ্যান্ডস-অন উদাহরণের মধ্য দিয়ে যাব, যাতে আপনি শিখতে পারেন কীভাবে একটি সিস্টেম তৈরি করতে হয় যা বুদ্ধিমান এবং অবিশ্বাস্যভাবে নির্ভরযোগ্য।

আমরা যা কভার করব:

  • এই গাইড কার জন্য?

  • সমস্যা বোঝা

    • সুতরাং, একটি টাইম-সিরিজ মডেল কি?

    • 1. কন্টেইনারগুলি ডিজাইন অনুসারে ক্ষণস্থায়ী হয়

    • 2. ভবিষ্যদ্বাণীগুলির মধ্যে প্রসঙ্গ হারিয়ে গেছে

    • 3. পুনরায় চালু করার সময় মডেল অ্যামনেসিয়া

  • সমাধান:এক্সটার্নাল স্টেট স্টোর

  • হ্যান্ডস-অন ইমপ্লিমেন্টেশন

    • ভাঙা পদ্ধতি দিয়ে শুরু করুন

    • ভলিউম দিয়ে কিভাবে এটি ঠিক করবেন

    • কোডটি কীভাবে রাজ্য পরিচালনা করে

    • স্বাস্থ্য এন্ডপয়েন্ট পরীক্ষা করুন

  • স্কেলিং সম্পর্কে কি?

    • রেডিস ক্লাস্টারের সাথে অনুভূমিক স্কেলিং

    • রেডিস সেন্টিনেলের সাথে উচ্চ প্রাপ্যতা

    • পরিচালিত Redis পরিষেবাগুলি ব্যবহার করুন

  • এড়ানোর জন্য সাধারণ ক্ষতি

    • ভলিউম কাজ করে অনুমান করবেন না

    • Redis মেমরি সীমা উপেক্ষা করবেন না

    • মনিটরিং এড়িয়ে যাবেন না

  • উপসংহার

এই গাইড কার জন্য?

এই টিউটোরিয়াল থেকে সবচেয়ে বেশি সুবিধা পেতে, আপনার বেল্টের নিচে কিছু জিনিস রাখা সহায়ক হবে। আমরা কিছু কোড এবং কমান্ড-লাইনের কাজে ডুব দেব, তাই একটু প্রস্তুতি অনেক দূর এগিয়ে যাবে।

  • এই প্রকল্পের প্রধান টুল হল ডকার এবং ডকার কম্পোজ। নিশ্চিত করুন যে আপনি সেগুলি ইনস্টল করেছেন এবং আপনার কম্পিউটারে চলছে৷

  • আপনি ডকার, পাইথন এবং ফ্লাস্ক ওয়েব ফ্রেমওয়ার্কের মৌলিক বিষয়গুলির সাথে স্বাচ্ছন্দ্য বোধ করলে এটি অনুসরণ করা আরও সহজ হবে। টিউটোরিয়ালে কমান্ড চালানোর জন্য কিছুটা কমান্ড-লাইন অভিজ্ঞতাও কার্যকর হবে।

  • কিন্তু চিন্তা করবেন না যদি আপনি আগে কখনো Redis ব্যবহার না করেন। আপনার যা জানা দরকার তা হল এটি একটি দ্রুত, ইন-মেমরি ডাটাবেস। আমরা পথ ধরে বাকিটা পরিচালনা করব।

এটি একটি নির্দেশিত সফর হিসাবে চিন্তা করুন. যতক্ষণ আপনি কৌতূহলী থাকবেন এবং মৌলিক সরঞ্জাম প্রস্তুত থাকবেন, আপনি দুর্দান্ত আকারে থাকবেন।

সমস্যা বোঝা

সমাধানগুলিতে ঝাঁপিয়ে পড়ার আগে, আসুন প্রথমে একটি টাইম-সিরিজ মডেল কী তা ব্যাখ্যা করি এবং তারপরে কেন এটিকে কন্টেইনারাইজ করা এত কঠিন তা অন্বেষণ করি৷

তাহলে, একটি টাইম-সিরিজ মডেল কি?

সহজ কথায়, একটি টাইম-সিরিজ মডেল হল এক ধরনের মডেল যা ভবিষ্যতের মানগুলির পূর্বাভাস দেওয়ার জন্য সময়ের সাথে সংগৃহীত ডেটা পয়েন্ট বিশ্লেষণ করে। আবহাওয়ার পূর্বাভাস দেওয়ার মতো এটিকে ভাবুন। একজন আবহাওয়াবিদ এখনই শুধু আকাশের দিকে তাকায় না। আগামীকাল কী ঘটবে তা পূর্বাভাস দিতে তারা গত কয়েক ঘণ্টা এবং দিনের তাপমাত্রা, চাপ এবং বাতাসের ধরণ দেখে।

টাইম-সিরিজ মডেলগুলি ডেটার সাথে একই জিনিস করে, তা ওয়েবসাইট ট্র্যাফিক, স্টকের দাম বা শক্তি খরচ হোক না কেন। মূল টেকঅ্যাওয়ে হল যে ইতিহাস গুরুত্বপূর্ণ। অতীতের ঘটনাগুলির ক্রম ভবিষ্যতের বিষয়ে একটি বুদ্ধিমান ভবিষ্যদ্বাণী করার জন্য প্রয়োজনীয় প্রসঙ্গ প্রদান করে৷

এখন, আপনি এই মডেলগুলিকে ডকারে রাখলে কী ভেঙে যায় তা এখানে।

1. কন্টেইনারগুলি নকশা অনুসারে ক্ষণস্থায়ী হয়

ডকার পাত্রে রাষ্ট্রহীন হতে বোঝানো হয়. এটি বেশিরভাগ API-এর জন্য দুর্দান্ত কাজ করে। একটি ব্যবহারকারী প্রোফাইল শেষ পয়েন্ট? রাষ্ট্রহীন। একটি অনুভূতি বিশ্লেষণ মডেল? রাষ্ট্রহীন। তারা একটি ইনপুট নেয়, একটি আউটপুট ফেরত দেয় এবং এর মধ্যে সবকিছু ভুলে যায়৷

টাইম-সিরিজ মডেল এই ভাবে কাজ করে না। তাদের পূর্বের ভবিষ্যদ্বাণী থেকে প্রসঙ্গ প্রয়োজন। এটি ছাড়া, আপনার মডেল মূলত অন্ধ৷

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

লক্ষ্য করুন কি অনুপস্থিত? কোনো ভলিউম নেই। রেডিস কন্টেইনারের ফাইল সিস্টেমে ডেটা সঞ্চয় করে, যার মানে ডেটা অস্থায়ী।

এটি চালান:

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:

তাহলে, ভলিউম কি এবং এটি কিভাবে কাজ করে?

আপনার কন্টেইনারের জন্য একটি ডেডিকেটেড বাহ্যিক হার্ড ড্রাইভ হিসাবে একটি ডকার ভলিউম মনে করুন। ডিফল্টরূপে, যখন একটি ধারক ডেটা লেখে, তখন এটি একটি অস্থায়ী স্তরে তা করে যা ধারকটি সরানো হলে ধ্বংস হয়ে যায়। একটি ভলিউম স্থায়ীভাবে ডেটা সংরক্ষণ করার একটি উপায় প্রদান করে৷

এটি কীভাবে কাজ করে তা এখানে:

  1. ডকার হোস্ট মেশিনে একটি বিশেষ স্টোরেজ এলাকা তৈরি করে এবং পরিচালনা করে, যে কোনো কন্টেইনারের ফাইল সিস্টেম থেকে সম্পূর্ণ আলাদা। আমাদের docker-compose.yml-এ, volumes: redis_data: নীচের অংশটি ডকারকে redis_data নামে একটি নামযুক্ত ভলিউম তৈরি করতে বলে৷ .

  2. Redis কন্টেইনার শুরু হলে, volumes: - redis_data:/data লাইন ডকারকে এই বাহ্যিক হার্ড ড্রাইভকে "প্লাগ ইন" করতে বলে। এটি redis_data কে সংযুক্ত করে /data এর ভলিউম কন্টেইনারের ভিতরে ডিরেক্টরি।

  3. এখন, যখনই কন্টেইনারের ভিতরে Redis প্রক্রিয়াটি তার /data-এ ডেটা লেখে ডিরেক্টরি (যা করার জন্য আমরা এটি কনফিগার করেছি), এটি আসলে redis_data এ লেখা হোস্ট মেশিনে ভলিউম।

  4. আপনি যখন ডকার কম্পোজ ডাউন চালান, তখন রেডিস কন্টেইনার ধ্বংস হয়ে যায়, কিন্তু 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-এ ফ্লাস্ক API সাজানো সেট ব্যবহার করে রেডিসে প্রতিটি ডেটা পয়েন্ট সঞ্চয় করে:

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]

Redis সাজানো সেট আপনাকে স্বয়ংক্রিয় সময় অর্ডার দেয়। ভলিউম নিশ্চিত করে যে এই ডেটাটি পুনরায় চালু হওয়া বেঁচে থাকবে।

স্বাস্থ্যের শেষ পয়েন্ট পরীক্ষা করুন

সবকিছু সঠিকভাবে সংযুক্ত আছে কিনা পরীক্ষা করুন:

curl http://localhost:5000/health

আপনার দেখতে হবে:

{
 "model_loaded": true,
 "redis_connected": true,
 "status": "healthy"
}

যদি redis_connected মিথ্যা, আপনার ডকার লগ চেক করুন. সাধারণ সমস্যা হল নেটওয়ার্ক কনফিগারেশন বা Redis সঠিকভাবে শুরু হচ্ছে না।

স্কেলিং সম্পর্কে কি?

এই সেটআপ একক-দৃষ্টান্ত স্থাপনার জন্য ভাল কাজ করে। যখন ট্রাফিক বেড়ে যায়, তখন আপনার কাছে কয়েকটি বিকল্প থাকে।

রেডিস ক্লাস্টার সহ অনুভূমিক স্কেলিং

উচ্চ থ্রুপুটের জন্য, একাধিক Redis নোড জুড়ে আপনার ডেটা বিতরণ করুন। Redis ক্লাস্টার স্বয়ংক্রিয়ভাবে শার্ডিং পরিচালনা করে।

রেডিস সেন্টিনেলের সাথে উচ্চ উপলব্ধতা

ফেইলওভার ক্ষমতা যোগ করুন যাতে আপনার স্টেট স্টোর ব্যর্থতার একক পয়েন্ট হয়ে না যায়। সেন্টিনেল রেডিস দৃষ্টান্ত নিরীক্ষণ করে এবং প্রাথমিক ব্যর্থ হলে প্রতিলিপি প্রচার করে।

পরিচালিত Redis পরিষেবাগুলি ব্যবহার করুন

AWS ElastiCache, Azure Cache for Redis, অথবা Google Cloud Memorystore অপারেশনাল বোঝা পরিচালনা করে। আপনি আপনার মডেলের উপর ফোকাস করুন, তারা রেডিস নির্ভরযোগ্যতা পরিচালনা করে।

মূল অন্তর্দৃষ্টি:আপনার API কন্টেনারগুলি রাষ্ট্রহীন থাকে। আপনি স্বাধীনভাবে রাষ্ট্রীয় দোকান স্কেল.

এড়ানোর জন্য সাধারণ ক্ষতি

আমি এটিকে যথেষ্ট জোর দিতে পারি না:উত্পাদনে স্থাপন করার আগে আপনার অধ্যবসায় পরীক্ষা করুন৷

ভলিউম কাজ করে বলে মনে করবেন না

প্রকৃতপক্ষে আপনার পাত্রে পুনরায় চালু করুন এবং স্থিতি বজায় আছে যাচাই করুন। আমি মোতায়েন ব্যর্থ হতে দেখেছি কারণ কেউ উৎপাদনে ভলিউম মাউন্ট করতে ভুলে গেছে।

Redis মেমরি সীমা উপেক্ষা করবেন না

রেডিস সবকিছু মেমরিতে রাখে। আপনার মেমরি ব্যবহার নিরীক্ষণ. আপনার কাজের চাপের জন্য উপযুক্ত ম্যাক্সমেমোরি নীতি সেট করুন। আপনার মেমরি ফুরিয়ে গেলে, রেডিস কীগুলি উচ্ছেদ করা শুরু করবে বা লিখতে অস্বীকার করবে৷

মনিটরিং এড়িয়ে যাবেন না

স্বাস্থ্য পরীক্ষা যোগ করুন। Redis সংযোগ স্থিতি নিরীক্ষণ. ভবিষ্যদ্বাণী লেটেন্সি ট্র্যাক করুন। আপনি জানতে চান কখন জিনিস ভেঙে যায়, রাগান্বিত ব্যবহারকারীদের কাছ থেকে এটি সম্পর্কে শিখবেন না।

উপসংহার

টাইম-সিরিজ মডেলের মেমরি প্রয়োজন। ডকার পাত্রে ডিফল্টরূপে মেমরি হারান. সমাধানটি সহজ:গণনা থেকে পৃথক রাষ্ট্র।

একটি বহিরাগত রাষ্ট্র দোকান হিসাবে Redis ব্যবহার করুন. সেই অবস্থা বজায় রাখতে ডকার ভলিউম ব্যবহার করুন। আপনার মডেল স্মার্ট থাকে, আপনার কন্টেইনারগুলি প্রতিস্থাপনযোগ্য থাকে এবং আপনার স্থাপনাগুলি নির্ভরযোগ্য হয়ে ওঠে৷

সম্পূর্ণ কাজের কোড github.com/ag-chirag/docker-redis-time-series এ উপলব্ধ। এটি ক্লোন করুন, এটি চালান, এটি ভাঙুন, এটি থেকে শিখুন৷

এবং মনে রাখবেন:সবচেয়ে সহজ সমাধান যা কাজ করে তা সাধারণত সঠিক। আপনার সর্বদা Kubernetes এবং StatefulSets এর প্রয়োজন নেই। কখনও কখনও ডকার কম্পোজ এবং একটি ভলিউম যথেষ্ট।

বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. CSS3 মাল্টি-কলাম কলাম-রুল প্রপার্টি

  2. অ্যান্ড্রয়েড কনকারেন্টলিঙ্কডকিউতে clear() কীভাবে ব্যবহার করবেন?

  3. জাভাস্ক্রিপ্ট - হ্যালো ওয়ার্ল্ড

  4. HTML বিকল্প মান বৈশিষ্ট্য