টেনসরফ্লো এজেন্ট এবং ফ্লটারের সাথে একটি বোর্ড গেম তৈরি করা

১. শুরু করার আগে

আলফাগো এবং আলফাস্টারের অসাধারণ সাফল্য অতিমানবীয় স্তরের গেম এজেন্ট তৈরিতে মেশিন লার্নিং ব্যবহারের সম্ভাবনা প্রদর্শন করেছে। শক্তিশালী গেম এজেন্ট তৈরির জন্য প্রয়োজনীয় দক্ষতা অর্জনের উদ্দেশ্যে একটি ছোট এমএল-চালিত গেম তৈরি করা একটি মজার অনুশীলন।

এই কোডল্যাবে, আপনি শিখবেন কীভাবে নিম্নলিখিত উপাদানগুলো ব্যবহার করে একটি বোর্ড গেম তৈরি করতে হয়:

  • রিইনফোর্সমেন্ট লার্নিং ব্যবহার করে একটি গেম এজেন্টকে প্রশিক্ষণ দেওয়ার জন্য টেনসরফ্লো এজেন্ট।
  • মডেলটি পরিবেশন করার জন্য TensorFlow পরিবেশন করা হচ্ছে
  • ফ্লাটার ব্যবহার করে একটি ক্রস-প্ল্যাটফর্ম বোর্ড গেম অ্যাপ তৈরি করুন

পূর্বশর্ত

  • ডার্ট সহ ফ্লাটার ডেভেলপমেন্টের প্রাথমিক জ্ঞান
  • TensorFlow ব্যবহার করে মেশিন লার্নিং-এর প্রাথমিক জ্ঞান, যেমন ট্রেনিং এবং ডেপ্লয়মেন্ট।
  • পাইথন, টার্মিনাল ও ডকার সম্পর্কে প্রাথমিক জ্ঞান।

আপনি যা শিখবেন

  • TensorFlow Agents ব্যবহার করে কীভাবে একটি নন-প্লেয়ার ক্যারেক্টার (NPC) এজেন্টকে প্রশিক্ষণ দেওয়া যায়
  • TensorFlow Serving ব্যবহার করে প্রশিক্ষিত মডেলটি কীভাবে পরিবেশন করবেন
  • কীভাবে একটি ক্রস-প্ল্যাটফর্ম ফ্লাটার বোর্ড গেম তৈরি করবেন

আপনার যা যা লাগবে

২. প্লেন স্ট্রাইক গেম

এই কোডল্যাবে আপনি যে গেমটি তৈরি করবেন তার নাম 'প্লেন স্ট্রাইক', এটি 'ব্যাটলশিপ' বোর্ড গেমটির মতো দেখতে একটি ছোট ২-খেলোয়াড়ের বোর্ড গেম। এর নিয়মগুলো খুবই সহজ:

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

এখানে গেমটির একটি নমুনা গেমপ্লে দেওয়া হলো:

77cead530c5a4aff.gif

৩. আপনার ফ্লাটার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন।

ফ্লাটার ডেভেলপমেন্টের জন্য এই কোডল্যাবটি সম্পন্ন করতে আপনার দুটি সফটওয়্যার প্রয়োজন— ফ্লাটার এসডিকে এবং একটি এডিটর

আপনি এই ডিভাইসগুলোর যেকোনো একটি ব্যবহার করে কোডল্যাবটি চালাতে পারেন:

  • iOS সিমুলেটর (এর জন্য Xcode টুলস ইনস্টল করা প্রয়োজন)।
  • অ্যান্ড্রয়েড এমুলেটর (অ্যান্ড্রয়েড স্টুডিওতে সেটআপ করা প্রয়োজন)।
  • একটি ব্রাউজার (ডিবাগিংয়ের জন্য ক্রোম আবশ্যক)।
  • একটি Windows , Linux , বা macOS ডেস্কটপ অ্যাপ্লিকেশন হিসেবে, আপনাকে অবশ্যই সেই প্ল্যাটফর্মে ডেভেলপ করতে হবে যেখানে আপনি এটি ডেপ্লয় করার পরিকল্পনা করছেন। সুতরাং, আপনি যদি একটি Windows ডেস্কটপ অ্যাপ ডেভেলপ করতে চান, তবে উপযুক্ত বিল্ড চেইন অ্যাক্সেস করার জন্য আপনাকে অবশ্যই Windows-এই ডেভেলপ করতে হবে। অপারেটিং সিস্টেম-ভিত্তিক কিছু নির্দিষ্ট আবশ্যকতা রয়েছে, যা docs.flutter.dev/desktop- এ বিস্তারিতভাবে আলোচনা করা হয়েছে।

৪. প্রস্তুত হয়ে নিন

এই কোডল্যাবের কোড ডাউনলোড করতে:

  1. এই কোডল্যাবটির গিটহাব রিপোজিটরিতে যান।
  2. এই কোডল্যাবের সমস্ত কোড ডাউনলোড করতে কোড > জিপ ডাউনলোড-এ ক্লিক করুন।

2cd45599f51fb8a2.png

  1. ডাউনলোড করা জিপ ফাইলটি আনজিপ করলে codelabs-main নামের একটি রুট ফোল্ডার পাওয়া যাবে, যেখানে আপনার প্রয়োজনীয় সমস্ত রিসোর্স রয়েছে।

এই কোডল্যাবের জন্য আপনার শুধু রিপোজিটরির tfagents-flutter/ সাবডিরেক্টরিতে থাকা ফাইলগুলো প্রয়োজন, যেটিতে একাধিক ফোল্ডার রয়েছে:

  • step0 থেকে step6 ফোল্ডারগুলিতে সেই প্রারম্ভিক কোড রয়েছে, যার উপর ভিত্তি করে আপনি এই কোডল্যাবের প্রতিটি ধাপ তৈরি করবেন।
  • finished ফোল্ডারটিতে সম্পূর্ণ নমুনা অ্যাপটির সম্পূর্ণ কোড রয়েছে।
  • প্রতিটি ফোল্ডারে একটি backbend সাবফোল্ডার থাকে, যেখানে ব্যাকএন্ড কোড থাকে, এবং একটি frontend সাবফোল্ডার থাকে, যেখানে ফ্লাটার ফ্রন্টএন্ড কোড থাকে।

৫. প্রজেক্টটির জন্য প্রয়োজনীয় উপাদানগুলো ডাউনলোড করুন।

ব্যাকএন্ড

আপনার টার্মিনাল খুলুন এবং tfagents-flutter সাবফোল্ডারে যান। নিম্নলিখিত কমান্ডটি চালান:

pip install -r requirements.txt

ফ্রন্টএন্ড

  1. VS Code-এ, File > Open folder-এ ক্লিক করুন এবং তারপরে আপনার আগে ডাউনলোড করা সোর্স কোড থেকে step0 ফোল্ডারটি নির্বাচন করুন।
  2. step0/frontend/lib/main.dart ফাইলটি খুলুন। যদি VS Code-এর কোনো ডায়ালগ বক্স আসে যা আপনাকে স্টার্টার অ্যাপের জন্য প্রয়োজনীয় প্যাকেজগুলো ডাউনলোড করতে বলে, তাহলে 'Get packages'-এ ক্লিক করুন।
  3. যদি আপনি এই ডায়ালগ বক্সটি দেখতে না পান, তাহলে আপনার টার্মিনাল খুলুন এবং step0/frontend ফোল্ডারে flutter pub get কমান্ডটি চালান।

7ada07c300f166a6.png

৬. ধাপ ০: স্টার্টার অ্যাপটি চালান

  1. VS Code-এ step0/frontend/lib/main.dart ফাইলটি খুলুন এবং নিশ্চিত করুন যে Android Emulator অথবা iOS Simulator সঠিকভাবে সেট আপ করা আছে ও স্ট্যাটাস বারে দেখা যাচ্ছে।

উদাহরণস্বরূপ, অ্যান্ড্রয়েড এমুলেটরের সাথে পিক্সেল ৫ ব্যবহার করলে আপনি যা দেখতে পান তা এখানে দেওয়া হলো:

9767649231898791.png

আইওএস সিমুলেটরের সাথে আইফোন ১৩ ব্যবহার করলে আপনি যা দেখতে পাবেন তা এখানে দেওয়া হলো:

95529e3a682268b2.png

  1. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন

অ্যাপটি চালান এবং অন্বেষণ করুন।

অ্যাপটি আপনার অ্যান্ড্রয়েড এমুলেটর বা আইওএস সিমুলেটরে চালু হবে। এর ইউজার ইন্টারফেস (UI) বেশ সহজ। এখানে দুটি গেম বোর্ড আছে; একজন খেলোয়াড় উপরের এজেন্টের বোর্ডের যেকোনো ঘরে ট্যাপ করে সেটিকে আক্রমণের স্থান হিসেবে বেছে নিতে পারে। আপনি একটি স্মার্ট এজেন্টকে প্রশিক্ষণ দেবেন, যাতে এটি খেলোয়াড়ের বোর্ডের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে অনুমান করতে পারে কোথায় আক্রমণ করতে হবে।

অভ্যন্তরীণভাবে, ফ্লাটার অ্যাপটি খেলোয়াড়ের বর্তমান বোর্ডটি ব্যাকএন্ডে পাঠাবে, যেখানে একটি রিইনফোর্সমেন্ট লার্নিং মডেল চালানো হয় এবং পরবর্তী চাল দেওয়ার জন্য একটি সম্ভাব্য ঘরের অবস্থান ফেরত দেওয়া হয়। প্রতিক্রিয়া পাওয়ার পর ফ্রন্টএন্ড UI-তে ফলাফলটি প্রদর্শন করবে।

734ab3d48a1133e1.png15cba2e741149c95.png

এখন এজেন্টের বোর্ডের কোনো সেলে ক্লিক করলে কিছুই হবে না, কারণ অ্যাপটি এখনও ব্যাকএন্ডের সাথে যোগাযোগ করতে পারছে না।

৭. ধাপ ১: একটি TensorFlow Agents Python পরিবেশ তৈরি করুন

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

প্রচলিত রিইনফোর্সমেন্ট লার্নিং (RL) পদ্ধতিতে, এজেন্ট প্রতিটি টাইম স্টেপে একটি পর্যবেক্ষণ গ্রহণ করে এবং একটি অ্যাকশন বেছে নেয়। অ্যাকশনটি পরিবেশে প্রয়োগ করা হয় এবং পরিবেশ একটি রিওয়ার্ড ও একটি নতুন পর্যবেক্ষণ ফেরত দেয়। এজেন্ট রিওয়ার্ডগুলোর সমষ্টি, যা রিটার্ন নামেও পরিচিত, সর্বাধিক করার জন্য অ্যাকশন বেছে নিতে একটি পলিসিকে প্রশিক্ষণ দেয়। বহুবার গেমটি খেলার মাধ্যমে, এজেন্ট প্যাটার্নগুলো শিখতে এবং গেমটিতে দক্ষতা অর্জনের জন্য তার দক্ষতা বাড়াতে সক্ষম হয়। প্লেন স্ট্রাইক গেমটিকে একটি RL সমস্যা হিসেবে সূত্রবদ্ধ করতে, বোর্ডের অবস্থাকে পর্যবেক্ষণ, একটি স্ট্রাইক পজিশনকে অ্যাকশন এবং হিট/মিস সিগন্যালকে রিওয়ার্ড হিসেবে ভাবুন।

bc5da07bc45062f4.png

NPC এজেন্টকে প্রশিক্ষণ দিতে, আপনি TensorFlow Agents ব্যবহার করেন, যা TensorFlow-এর জন্য একটি নির্ভরযোগ্য, স্কেলেবল এবং সহজে ব্যবহারযোগ্য রিইনফোর্সমেন্ট লার্নিং লাইব্রেরি।

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

OpenAI Gym (যেমন, আটারি গেম), Mujuco ইত্যাদিতে আগে থেকে তৈরি অনেক গেম এনভায়রনমেন্ট রয়েছে, যা TF এজেন্টরা সহজেই ব্যবহার করতে পারে। কিন্তু যেহেতু প্লেন স্ট্রাইক গেমটি একটি সম্পূর্ণ কাস্টম গেম, তাই আপনাকে প্রথমে একেবারে গোড়া থেকে একটি নতুন এনভায়রনমেন্ট তৈরি করতে হবে।

TF Agents পাইথন এনভায়রনমেন্ট বাস্তবায়ন করতে, আপনাকে নিম্নলিখিত মেথডগুলো ইমপ্লিমেন্ট করতে হবে:

class YourGameEnv(py_environment.PyEnvironment):

  def __init__(self):
    """Initialize environment."""


  def action_spec(self):
    """Return action_spec."""


  def observation_spec(self):
    """Return observation_spec."""


  def _reset(self):
    """Return initial_time_step."""


  def _step(self, action):
    """Apply action and return new time_step."""

সবচেয়ে গুরুত্বপূর্ণটি হলো _step() ফাংশন, যা একটি অ্যাকশন গ্রহণ করে এবং একটি নতুন time_step অবজেক্ট রিটার্ন করে। প্লেন স্ট্রাইক গেমের ক্ষেত্রে, আপনার একটি গেম বোর্ড থাকে; যখন একটি নতুন স্ট্রাইক পজিশন আসে, তখন গেম বোর্ডের অবস্থার উপর ভিত্তি করে এনভায়রনমেন্ট নির্ধারণ করে:

  • এরপর গেম বোর্ডটি কেমন দেখতে হবে (লুকানো সমতলের অবস্থান বিবেচনা করে ঘরটির রঙ কি লাল নাকি হলুদ হবে?)
  • ঐ অবস্থানের জন্য খেলোয়াড়কে কী পুরস্কার দেওয়া উচিত (সফলতার পুরস্কার নাকি ব্যর্থতার শাস্তি?)
  • খেলাটি কি শেষ হয়ে যাবে (কেউ কি জিতেছে?)
  • _planestrike_py_environment.py ফাইলের _step() ফাংশনে নিম্নলিখিত কোডটি যোগ করুন:
if self._hit_count == self._plane_size:
    self._episode_ended = True
    return self.reset()

if self._strike_count + 1 == self._max_steps:
    self.reset()
    return ts.termination(
        np.array(self._visible_board, dtype=np.float32), UNFINISHED_GAME_REWARD
    )

self._strike_count += 1
action_x = action // self._board_size
action_y = action % self._board_size
# Hit
if self._hidden_board[action_x][action_y] == HIDDEN_BOARD_CELL_OCCUPIED:
    # Non-repeat move
    if self._visible_board[action_x][action_y] == VISIBLE_BOARD_CELL_UNTRIED:
        self._hit_count += 1
        self._visible_board[action_x][action_y] = VISIBLE_BOARD_CELL_HIT
        # Successful strike
        if self._hit_count == self._plane_size:
            # Game finished
            self._episode_ended = True
            return ts.termination(
                np.array(self._visible_board, dtype=np.float32),
                FINISHED_GAME_REWARD,
            )
        else:
            self._episode_ended = False
            return ts.transition(
                np.array(self._visible_board, dtype=np.float32),
                HIT_REWARD,
                self._discount,
            )
    # Repeat strike
    else:
        self._episode_ended = False
        return ts.transition(
            np.array(self._visible_board, dtype=np.float32),
            REPEAT_STRIKE_REWARD,
            self._discount,
        )
# Miss
else:
    # Unsuccessful strike
    self._episode_ended = False
    self._visible_board[action_x][action_y] = VISIBLE_BOARD_CELL_MISS
    return ts.transition(
        np.array(self._visible_board, dtype=np.float32),
        MISS_REWARD,
        self._discount,

৮. ধাপ ২: TensorFlow Agents ব্যবহার করে গেম এজেন্টকে প্রশিক্ষণ দিন

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

  • প্রথমে, আপনাকে ট্রেনিং এবং ইভ্যালুয়েশন এনভায়রনমেন্ট ইনস্ট্যানশিয়েট করতে হবে। step2/backend/training.py ফাইলের train_agent() ফাংশনে এই কোডটি যোগ করুন:
train_py_env = planestrike_py_environment.PlaneStrikePyEnvironment(
    board_size=BOARD_SIZE, discount=DISCOUNT, max_steps=BOARD_SIZE**2
)
eval_py_env = planestrike_py_environment.PlaneStrikePyEnvironment(
    board_size=BOARD_SIZE, discount=DISCOUNT, max_steps=BOARD_SIZE**2
)

train_env = tf_py_environment.TFPyEnvironment(train_py_env)
eval_env = tf_py_environment.TFPyEnvironment(eval_py_env)
  • এরপরে, আপনাকে একটি রিইনফোর্সমেন্ট লার্নিং এজেন্ট তৈরি করতে হবে যা প্রশিক্ষিত হবে। এই কোডল্যাবে, আপনি REINFORCE এজেন্ট ব্যবহার করবেন, যা একটি পলিসি-ভিত্তিক এজেন্ট। উপরের কোডের ঠিক নিচে এই কোডটি যোগ করুন:
actor_net = tfa.networks.Sequential(
    [
        tfa.keras_layers.InnerReshape([BOARD_SIZE, BOARD_SIZE], [BOARD_SIZE**2]),
        tf.keras.layers.Dense(FC_LAYER_PARAMS, activation="relu"),
        tf.keras.layers.Dense(BOARD_SIZE**2),
        tf.keras.layers.Lambda(lambda t: tfp.distributions.Categorical(logits=t)),
    ],
    input_spec=train_py_env.observation_spec(),
)

optimizer = tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE)

train_step_counter = tf.Variable(0)

tf_agent = reinforce_agent.ReinforceAgent(
    train_env.time_step_spec(),
    train_env.action_spec(),
    actor_network=actor_net,
    optimizer=optimizer,
    normalize_returns=True,
    train_step_counter=train_step_counter,
)
  • সবশেষে, ট্রেনিং লুপের মধ্যে এজেন্টকে প্রশিক্ষণ দিন। লুপের মধ্যে, প্রথমে আপনি গেম খেলার কয়েকটি পর্ব একটি বাফারে সংগ্রহ করবেন এবং তারপর সেই বাফার করা ডেটা দিয়ে এজেন্টকে প্রশিক্ষণ দেবেন। step2/backend/training.py ফাইলের train_agent() ফাংশনে এই কোডটি যোগ করুন:
# Collect a few episodes using collect_policy and save to the replay buffer.
collect_episode(
    train_py_env,
    collect_policy,
    COLLECT_EPISODES_PER_ITERATION,
    replay_buffer_observer,
)

# Use data from the buffer and update the agent's network.
iterator = iter(replay_buffer.as_dataset(sample_batch_size=1))
trajectories, _ = next(iterator)
tf_agent.train(experience=trajectories)
replay_buffer.clear()
  • এখন আপনি প্রশিক্ষণটি শুরু করতে পারেন। আপনার টার্মিনালে, কম্পিউটারের step2/backend ফোল্ডারে যান এবং এটি চালান:
python training.py

আপনার হার্ডওয়্যার কনফিগারেশনের উপর নির্ভর করে ট্রেনিং শেষ হতে ৮-১২ ঘন্টা সময় লাগে (আপনাকে পুরো ট্রেনিংটি নিজে থেকে শেষ করতে হবে না, কারণ step3 -এ একটি প্রি-ট্রেইনড মডেল দেওয়া আছে)। এই সময়ের মধ্যে, আপনি TensorBoard দিয়ে এর অগ্রগতি পর্যবেক্ষণ করতে পারেন। একটি নতুন টার্মিনাল খুলুন, আপনার কম্পিউটারের step2/backend ফোল্ডারে যান এবং এটি চালান:

tensorboard --logdir tf_agents_log/

tf_agents_log হলো সেই ফোল্ডার যেখানে ট্রেনিং লগ থাকে। একটি নমুনা ট্রেনিং রান দেখতে নিচের মতো:

33e12e2b387c063a.png8488632ccf43348a.png

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

প্রশিক্ষণ সম্পন্ন হওয়ার পর, প্রশিক্ষিত মডেলটি policy_model ফোল্ডারে এক্সপোর্ট করা হয়।

৯. ধাপ ৩: TensorFlow Serving ব্যবহার করে প্রশিক্ষিত মডেলটি স্থাপন করুন।

এখন যেহেতু আপনি গেম এজেন্টটিকে প্রশিক্ষণ দিয়েছেন, আপনি TensorFlow Serving ব্যবহার করে এটিকে ডেপ্লয় করতে পারেন।

  • আপনার টার্মিনালে, কম্পিউটারের step3/backend ফোল্ডারে যান এবং Docker-এর মাধ্যমে TensorFlow Serving চালু করুন:
docker run -t --rm -p 8501:8501 -p 8500:8500 -v "$(pwd)/backend/policy_model:/models/policy_model" -e MODEL_NAME=policy_model tensorflow/serving

ডকার প্রথমে স্বয়ংক্রিয়ভাবে TensorFlow Serving ইমেজটি ডাউনলোড করে, যাতে এক মিনিট সময় লাগে। এরপর TensorFlow Serving চালু হওয়া উচিত। লগটি এই কোড স্নিপেটের মতো দেখতে হবে:

2022-05-30 02:38:54.147771: I tensorflow_serving/model_servers/server.cc:89] Building single TensorFlow model file config:  model_name: policy_model model_base_path: /models/policy_model
2022-05-30 02:38:54.148222: I tensorflow_serving/model_servers/server_core.cc:465] Adding/updating models.
2022-05-30 02:38:54.148273: I tensorflow_serving/model_servers/server_core.cc:591]  (Re-)adding model: policy_model
2022-05-30 02:38:54.262684: I tensorflow_serving/core/basic_manager.cc:740] Successfully reserved resources to load servable {name: policy_model version: 123}
2022-05-30 02:38:54.262768: I tensorflow_serving/core/loader_harness.cc:66] Approving load for servable version {name: policy_model version: 123}
2022-05-30 02:38:54.262787: I tensorflow_serving/core/loader_harness.cc:74] Loading servable version {name: policy_model version: 123}
2022-05-30 02:38:54.265010: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:38] Reading SavedModel from: /models/policy_model/123
2022-05-30 02:38:54.277811: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:90] Reading meta graph with tags { serve }
2022-05-30 02:38:54.278116: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:132] Reading SavedModel debug info (if present) from: /models/policy_model/123
2022-05-30 02:38:54.280229: I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-05-30 02:38:54.332352: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-05-30 02:38:54.337000: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 2193480000 Hz
2022-05-30 02:38:54.402803: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/policy_model/123
2022-05-30 02:38:54.410707: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 145695 microseconds.
2022-05-30 02:38:54.412726: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/policy_model/123/assets.extra/tf_serving_warmup_requests
2022-05-30 02:38:54.417277: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: policy_model version: 123}
2022-05-30 02:38:54.419846: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-05-30 02:38:54.420066: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-05-30 02:38:54.428339: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2022-05-30 02:38:54.431620: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...

এন্ডপয়েন্টটি প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা নিশ্চিত করতে আপনি সেখানে একটি নমুনা অনুরোধ পাঠাতে পারেন:

curl -d '{"signature_name":"action","instances":[{"0/discount":0.0,"0/observation":[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],"0/reward":0.0,"0/step_type":0}]}'     -X POST http://localhost:8501/v1/models/policy_model:predict

এন্ডপয়েন্টটি একটি পূর্বাভাসিত অবস্থান 45 ফেরত দেবে, যা বোর্ডের কেন্দ্রে (5, 5) অবস্থানে অবস্থিত (যারা আগ্রহী, তারা বের করার চেষ্টা করতে পারেন যে কেন প্রথম স্ট্রাইকের অবস্থানের জন্য বোর্ডের কেন্দ্র একটি ভালো অনুমান)।

{
    "predictions": [45]
}

ব্যাস! আপনি সফলভাবে এনপিসি এজেন্টের পরবর্তী আক্রমণের অবস্থান ভবিষ্যদ্বাণী করার জন্য একটি ব্যাকএন্ড তৈরি করেছেন।

১০. ধাপ ৪: অ্যান্ড্রয়েড এবং আইওএস-এর জন্য ফ্লাটার অ্যাপ তৈরি করুন

ব্যাকএন্ড প্রস্তুত। ফ্লাটার অ্যাপ থেকে স্ট্রাইক পজিশনের পূর্বাভাস পেতে আপনি এখন এতে রিকোয়েস্ট পাঠানো শুরু করতে পারেন।

  • প্রথমে, আপনাকে এমন একটি ক্লাস সংজ্ঞায়িত করতে হবে যা পাঠানোর জন্য ইনপুটগুলোকে আবৃত করবে। এই কোডটি step4/frontend/lib/game_agent.dart ফাইলে যোগ করুন:
class Inputs {
  final List<double> _boardState;
  Inputs(this._boardState);

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['0/discount'] = [0.0];
    data['0/observation'] = [_boardState];
    data['0/reward'] = [0.0];
    data['0/step_type'] = [0];
    return data;
  }
}

এখন আপনি পূর্বাভাস তৈরি করার জন্য TensorFlow Serving-এ অনুরোধ পাঠাতে পারেন।

  • step4/frontend/lib/game_agent.dart ফাইলের predict() ফাংশনে এই কোডটি যোগ করুন:
var flattenedBoardState = boardState.expand((i) => i).toList();
final response = await http.post(
  Uri.parse('http://$server:8501/v1/models/policy_model:predict'),
  body: jsonEncode(<String, dynamic>{
    'signature_name': 'action',
    'instances': [Inputs(flattenedBoardState)]
  }),
);

if (response.statusCode == 200) {
  var output = List<int>.from(
      jsonDecode(response.body)['predictions'] as List<dynamic>);
  return output[0];
} else {
  throw Exception('Error response');
}

অ্যাপটি ব্যাকএন্ড থেকে প্রতিক্রিয়া পাওয়ার পর, আপনি গেমের অগ্রগতি প্রতিফলিত করতে গেমের UI আপডেট করেন।

  • step4/frontend/lib/main.dart ফাইলের _gridItemTapped() ফাংশনে এই কোডটি যোগ করুন:
int agentAction =
    await _policyGradientAgent.predict(_playerVisibleBoardState);
_agentActionX = agentAction ~/ _boardSize;
_agentActionY = agentAction % _boardSize;
if (_playerHiddenBoardState[_agentActionX][_agentActionY] ==
    hiddenBoardCellOccupied) {
  // Non-repeat move
  if (_playerVisibleBoardState[_agentActionX][_agentActionY] ==
      visibleBoardCellUntried) {
    _agentHitCount++;
  }
  _playerVisibleBoardState[_agentActionX][_agentActionY] =
      visibleBoardCellHit;
} else {
  _playerVisibleBoardState[_agentActionX][_agentActionY] =
      visibleBoardCellMiss;
}
setState(() {});

এটা চালান

  1. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  2. খেলাটি শুরু করতে এজেন্টের বোর্ডের যেকোনো ঘরে ট্যাপ করুন।

852942d0de299c1f.png6ae3601470c8e33a.png

১১. ধাপ ৫: ডেস্কটপ প্ল্যাটফর্মগুলোর জন্য ফ্লাটার অ্যাপটি সক্রিয় করুন

অ্যান্ড্রয়েড এবং আইওএস ছাড়াও ফ্লাটার লিনাক্স, ম্যাক এবং উইন্ডোজ সহ বিভিন্ন ডেস্কটপ প্ল্যাটফর্ম সমর্থন করে।

লিনাক্স

  1. নিশ্চিত করুন যে টার্গেট ডিভাইসটি সেট করা আছে 86cba523de82b4f9.png VSCode-এর স্ট্যাটাস বারে।
  2. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  3. খেলাটি শুরু করতে এজেন্টের বোর্ডের যেকোনো ঘরে ক্লিক করুন।

48594c7c0a589733.png

ম্যাক

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

এই কোডটি যথাক্রমে step4/frontend/macOS/Runner/DebugProfile.entitlements এবং step4/frontend/macOS/Runner/Release.entitlements ফাইলে যোগ করুন:

<key>com.apple.security.network.client</key>
<true/>
  1. নিশ্চিত করুন যে টার্গেট ডিভাইসটি সেট করা আছে eb4b0b5563824138.png VSCode-এর স্ট্যাটাস বারে।
  2. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  3. খেলাটি শুরু করতে এজেন্টের বোর্ডের যেকোনো ঘরে ক্লিক করুন।

55a5de3674194e89.png

উইন্ডোজ

  1. নিশ্চিত করুন যে টার্গেট ডিভাইসটি সেট করা আছে 9587be1bb375bc0f.png VSCode-এর স্ট্যাটাস বারে।
  2. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন এবং তারপর অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  3. খেলাটি শুরু করতে এজেন্টের বোর্ডের যেকোনো ঘরে ক্লিক করুন।

41d9f87d84c5e755.png

১২. ধাপ ৬: ওয়েব প্ল্যাটফর্মের জন্য ফ্লাটার অ্যাপটি সক্রিয় করুন

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

  1. নিশ্চিত করুন যে টার্গেট ডিভাইসটি সেট করা আছে 71db93efa928d15d.png VSCode-এর স্ট্যাটাস বারে।
  2. ক্লিক করুন a19a0c68bc4046e6.png ডিবাগিং শুরু করুন এবং তারপর ক্রোম ব্রাউজারে অ্যাপটি লোড হওয়ার জন্য অপেক্ষা করুন।
  3. খেলাটি শুরু করতে এজেন্টের বোর্ডের যেকোনো ঘরে ক্লিক করুন।

fae7490304e28dfe.png

১৩. অভিনন্দন

আপনি মানুষের বিরুদ্ধে খেলার জন্য একটি এমএল-চালিত এজেন্টসহ একটি বোর্ড গেম অ্যাপ তৈরি করেছেন!

আরও জানুন