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

1. আপনি শুরু করার আগে

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

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

  • টেনসরফ্লো এজেন্ট একটি গেম এজেন্টকে রিইনফোর্সমেন্ট শেখার সাথে প্রশিক্ষণ দিতে
  • TensorFlow মডেল পরিবেশন করা
  • একটি ক্রস-প্ল্যাটফর্ম বোর্ড গেম অ্যাপ তৈরি করতে ফ্লটার

পূর্বশর্ত

  • ডার্টের সাথে ফ্লটার বিকাশের প্রাথমিক জ্ঞান
  • টেনসরফ্লো সহ মেশিন লার্নিং এর প্রাথমিক জ্ঞান, যেমন প্রশিক্ষণ বনাম স্থাপনা
  • পাইথন, টার্মিনাল এবং ডকার সম্পর্কে প্রাথমিক জ্ঞান

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

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

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

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

এখানে গেমটির একটি নমুনা গেমপ্লে রয়েছে:

77cead530c5a4aff.gif

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

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

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

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

4. সেট আপ করুন

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

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

2cd45599f51fb8a2.png

  1. আপনার প্রয়োজনীয় সমস্ত সংস্থান সহ একটি codelabs-main রুট ফোল্ডার আনপ্যাক করতে ডাউনলোড করা জিপ ফাইলটি আনজিপ করুন।

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

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

5. প্রকল্পের জন্য নির্ভরতা ডাউনলোড করুন

ব্যাকএন্ড

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

pip install -r requirements.txt

ফ্রন্টেন্ড

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

7ada07c300f166a6.png

6. ধাপ 0: স্টার্টার অ্যাপটি চালান

  1. VS কোডে step0/frontend/lib/main.dart ফাইলটি খুলুন, নিশ্চিত করুন যে Android এমুলেটর বা iOS সিমুলেটর সঠিকভাবে সেট আপ হয়েছে এবং স্ট্যাটাস বারে প্রদর্শিত হচ্ছে।

উদাহরণস্বরূপ, আপনি যখন Android এমুলেটরের সাথে Pixel 5 ব্যবহার করেন তখন আপনি যা দেখতে পান তা এখানে:

9767649231898791.png

আপনি যখন iOS সিমুলেটরের সাথে iPhone 13 ব্যবহার করেন তখন আপনি যা দেখেন তা এখানে:

95529e3a682268b2.png

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

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

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

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

734ab3d48a1133e1.png15cba2e741149c95.png

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

7. ধাপ 1: একটি টেনসরফ্লো এজেন্ট পাইথন পরিবেশ তৈরি করুন

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

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

bc5da07bc45062f4.png

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

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

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

একটি TF এজেন্ট পাইথন পরিবেশ বাস্তবায়ন করতে, আপনাকে নিম্নলিখিত পদ্ধতিগুলি বাস্তবায়ন করতে হবে:

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,

8. ধাপ 2: টেনসরফ্লো এজেন্টদের সাথে গেম এজেন্টকে প্রশিক্ষণ দিন

TF এজেন্ট পরিবেশের সাথে, আপনি গেম এজেন্টকে প্রশিক্ষণ দিতে পারেন। এই কোডল্যাবের জন্য, আপনি একটি 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

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

tensorboard --logdir tf_agents_log/

tf_agents_log হল সেই ফোল্ডার যা প্রশিক্ষণ লগ ধারণ করে। একটি নমুনা প্রশিক্ষণ রান নীচের মত দেখায়:

33e12e2b387c063a.png8488632ccf43348a.png

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

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

9. ধাপ 3: টেনসরফ্লো সার্ভিং সহ প্রশিক্ষিত মডেল স্থাপন করুন

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

  • আপনার টার্মিনালে, আপনার কম্পিউটারের step3/backend ফোল্ডারে যান এবং ডকারের সাথে TensorFlow পরিবেশন শুরু করুন:
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

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

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]
}

তাই তো! NPC এজেন্টের পরবর্তী স্ট্রাইক অবস্থানের পূর্বাভাস দিতে আপনি সফলভাবে একটি ব্যাকএন্ড তৈরি করেছেন..

10. ধাপ 4: Android এবং iOS-এর জন্য Flutter অ্যাপ তৈরি করুন

ব্যাকএন্ড প্রস্তুত। আপনি Flutter অ্যাপ থেকে স্ট্রাইক অবস্থানের পূর্বাভাস পুনরুদ্ধার করতে এটিতে অনুরোধ পাঠানো শুরু করতে পারেন।

  • প্রথমত, আপনাকে এমন একটি শ্রেণী নির্ধারণ করতে হবে যা পাঠানোর জন্য ইনপুটগুলিকে মোড়ানো হয়। 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

11. ধাপ 5: ডেস্কটপ প্ল্যাটফর্মের জন্য Flutter অ্যাপটি সক্ষম করুন

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

লিনাক্স

  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

12. ধাপ 6: ওয়েব প্ল্যাটফর্মের জন্য Flutter অ্যাপ সক্রিয় করুন

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

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

fae7490304e28dfe.png

13. অভিনন্দন

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

আরও জানুন