شروع: روزهایی که فقط دقت مدل مهم بود
سال ۱۳۹7 بود. من تازه وارد دنیای دیتا ساینس شده بودم. روزها با ژوپیترنوتبوک و پایتون میگذشت. شبها با مقالات جدید در مدیوم و Towards Data Sciene. در آن زمان، دنیای من ساده بود:
- دقت مدل = موفقیت
- AUC بالاتر = تیم بهتر
- اضافه کردن یک ویژگی جدید = هیجان
یادم میآید اولین مدل ردهبندیام را با هیجان و غرور به تیم تحویل دادم. دقت تقریبن ۹0٪. همه خوشحال بودند.
و من نمیدانستم که این تازه اول ماجراست.
فصل اول: تولد یک مهندس داده (وقتی مدلها به خط تولید رسیدند)
چند ماه بعد و بسرعت باد، مدلهای ما وارد دنیای واقعی شدند. متاسفانه دنیای واقعی بیرحمانه بود. کار به هیچ وجه همانند اجرای ساده روی سیستم لوکال، پیش نمیرفت. هر فاز و بخش از کار چالشهایی داشت که در بدو امر خودم را سرزنش میکردم که چرا وارد این حیطه شدم.
اولین زنگ خطر
مدل ما که با دقت ۹0٪ در محیط توسعه عالی کار میکرد، در تولید:
- هر ۳ ساعت یکبار کرش میکرد.
- مصرف حافظهاش از ۲ گیگ به ۱۶ گیگ میرسید.
- تیم DevOps از دست ما بشدت کلافه شده بودند.
درسی که گرفتم:
یک مدل خوب بدون زیرساخت مناسب، فقط یک فایل PICKLE است که هیچکس نمیتواند از آن استفاده کند.
مهاجرت به سمت مهندسی داده
کمکم مسیرم عوض شد، چون در طول مسیر چندین بار فهمیدم که با داشتن دیتای خوب که ماحصل جابجایی و انتقال اصولی و درست از منابع مختلف بود، ما میتونیم مدل خوبی رو بدست بیاریم. در اون برههی زمانی چیزی بنام مهندس داده در تیمها وجود نداشت و نا اصلن به چنین مهارتی احساس نیاز نمیشد. همه جوگیر بودند تا اندکی دیتا داشتند، بسرعت یک مدل روی اون بزنند و کار رو به رقبا نشون بدهند. اما هر چقدر که دیتاهامون بزرگتر شد، فهمیدیم که دیگه نمیشه کسی که فکرش روی نوع مدل و دقت متمرکز هست، بره دنبال جمعآوری دیتا از منابع و سورسهای مختلف.
این شد که از ساختن مدل به ساختن خطوط لولهای رفتم که مدلها را تغذیه میکنند. کمی با تکنولوژیهایی مثل ایرفلو و اسپارک که متناسب محیط کار بود، کار کردیم و دیدیم چقدر تو کار بما کمک میکنند.
[Jupyter Notebook] ===> [Python Scripts] ===> [Airflow DAGs] ===> [Spark Jobs]
اما همیشه چالشهای جدید وجود داشت:
- مقیاس: از ۱۰۰۰ رکورد به ۱۰۰ میلیون رکورد رسیدیم.
- زمان: از پردازش دستی به ۱۵ دقیقه SLA رفتیم.
- پیچیدگی: از ۳ جدول به ۴۷ منبع داده کارمان ختم شد.
و مهمتر از همه: فقط من نبودم که مدلها را میدیدم. مشتریان، تیم فروش و مدیران مجموعه و سرمایهگذاران. در این مرحله مدلهای ما از منابع مختلف دیتایی که به کمک مهارتهای مهندسی داده وارد بازی کرده بودیم، تغذیه میکردند. احتمال خطا بیشتر شده بود. قبلن دیتا استاتیک (ثابت) بود، ولی الان داینامیک (متغیر) شده بود و هر لحظه ممکن بود اسکیمای دیتا بطور اشتباه وارد بشود و ما هم طبق معمول منتظر اشتباه بودیم تا بریم اون باگ رو رفع کنیم.
فصل دوم: نقطه عطف – وقتی مدل اشتباه کرد
یکی از شبهای زمستان ۱۴۰۰، زنگ تلفنم در نیمههای شب به صدا درآمد.
“محمد جان، مدل اعتبارسنجی مشتریها داره همه رو رد میکنه. ۳۰۰۰ درخواست توی صف مونده.”
داشبورد را باز کردم. چیزی که دیدم ترسناک بود:
مدلی که ۶ ماه پیش آموزش داده بودیم، ناگهان عملکردش افتضاح شده بود:
- دقت از ۹0٪ به ۴۳٪ رسیده بود.
- نرخ رد اشتباه از ۵٪ به ۳۸٪ افزایش داشت.
- مشتریان واقعی داشتند رد میشدند و این یعنی فاجعه.
اما علت چی بود؟
یک تغییر در سیستم منبع داده. فیلد income دیگر با همان فرمت قبلی نمیآمد. این قسمت بخاطر یک اشتباه در پایپلاینی که نوشته بودیم رخ داد. مدل بدون اینکه کسی متوجه شود، روی دادههای اشتباه پیشبینی میکرد.
آن شب تا صبح بیدار بودیم. نه برای ساختن مدل بهتر، بلکه برای:
- پیدا کردن منبع مشکل.
- رولبک به نسخه قبلی.
- اضافه کردن مانیتورینگ برای drift detection.
- نوشتن مستندات برای دفعه بعد.
درسی که گرفتم:
مدلها در محیط پروداکشن و عملیاتی بسرعت پیر و فرتوت میشوند، اشتباه میکنند، و نیازمند یاری سبز ما هستند. اگر کسی مراقبشان نباشد، مثل یک بمب ساعتی کل سیستم را به چالش خواهند کشید.
فصل سوم: تولد MLSecOps (وقتی فهمیدم امنیت یعنی چه)
درست زمانی که فکر میکردم همه چیز را بلدم، موج جدیدی از حملات به سیستمهای ML رسید.
اولین برخورد با حمله
یک روز صبح، مدیر محصول با حالتی عصبانی تماس گرفت و گفت:
“محمد، مدل توصیهگر ما داره به همه کاربرا یه محصول خاص رو پیشنهاد میده. یه فروشنده رقیب.”
نگاهی به لاگها انداختم. کسی از API ما میلیونها درخواست با دادههای جعلی فرستاده بود تا مدل را دستکاری (manipulate) کند. کمی در گوگل جستجو کردم و مقداری نیز از آیتالله جیپیتی کسب تکلیف نمودم. بالاخره دوزاری من افتاد؛ به ما حمله شده است.
نوع حمله:
Data Poisoning
واقعن در ابتدای داستان، نمیدانستم این حملات اسم دارند. فکر میکردم باگ نرمافزاری است. اما این فقط نوک کوه یخ بود. هر چقدر بیشتر مطالعه کردم و مقالات رو بررسی کردم، ترسم بیشتر شد. منی که تنها میخواستم دیتا تحلیل کنم و الگوریتم پیشبینی را روی دیتا فیت کنم، کارم رسیده بود به دست و پنجه نرم کردن با حملات سایبری. و صد البته که چیز بدی هم نیست، اگر اهل یاد گرفتن تجربیات جدید باشیم.
کشف دنیای MLSecOps
شروع کردم به تحقیق. فهمیدم دنیایی به نام MLSecOps وجود دارد که دقیقن همان جایی است که من به آن رسیدهام؛ حتی بدون اینکه قصد قبلی آنرا داشته باشم. کاملن تصادفی و تنها بدلیل مواردی که در محیط کاری و پروژهای که بخشی از آن بودم، رخ دادند.
کمکم «چیزهایی که میشناختم» و تقریبن کامل نبودند، به «چیزهایی که تازه فهمیدم» تبدیل شدند (و صد البته که هر شخصی با خوردن خاک صحنه و کسب تجربه میتواند مدعی شود که هر روز چیزهایی جدیدتر و بهتری بفهمد):
| چیزی که میشناختم | چیزی که تازه فهمیدم |
|---|---|
| دقت مدل | مقاومت مدل در برابر حملات |
| خط لوله داده | امنیت خط لوله داده |
| drift detection | تشخیص حملات adversarial |
| نسخهبندی مدل | امضای دیجیتال مدلها |
| API برای مدل | احراز هویت و rate limiting |
لحظهای که فهمیدم این راه من است
داشتم مقالهای میخواندم درباره حمله Model Inversion. حملهای که مهاجم میتواند از روی خروجی مدل، دادههای آموزشی را بازسازی کند. همین چند ماه پیش، مدل ما دادههای مشتریان شامل شماره شبا و مبالغ تراکنش را در خروجیاش لو میداد.
آن لحظه فهمیدم:
کار من فقط ساختن مدل و خط لوله نیست. محافظت از دادهها و مدلها در برابر تهدیدات، شاید مهمتر از خود ساختن باشد. بسیار مهمتر. چون در پروداکشن هیچ کسی با یک مجری و مهندس شوخی ندارد. بخصوص هر جایی که پای پول در میان باشد. این شد که متوجه شدم، این راه راه من است.
فصل چهارم: چرا MLSecOps نقطه تلاقی مسیر من شد؟
حالا که به گذشته نگاه میکنم، مسیرم را مثل یک پازل میبینم:
دیتا ساینس ===> درک مدلها و دادهها
مهندسی داده ===> درک خطوط لوله و مقیاس
MLSecOps ===> درک تهدیدات و امنیت
هر مرحله، کمبود مرحله قبل را پر کرد:
دیتا ساینس به من آموخت:
- مدلها چگونه کار میکنند.
- دادهها چه نقشی دارند
- چرا یک مدل اشتباه میکند.
- چگونه دیتا را تمیز کنم و تمیزی دیتا چقدر نقش دارد.
مهندسی داده به من آموخت:
- چگونه داده را در مقیاس بزرگ و با سرعت دلخواه، جابهجا کنم.
- چگونه خطوط لوله را قابل اعتماد کنم.
- SLA و مانیتورینگ یعنی چه و کی از آنها بهرهمند شوم.
- برای پردازش بچ و استریم با چه تکنولوژیهایی کار کنم.
- قبل از اجرای خط لوله، مصرفکنندگان دیتا را بخوبی بشناسم.
حالا MLSecOps دارد به من میآموزد:
- چگونه از این همه سرمایه محافظت کنم.
- تهدیدات کجا کمین کردهاند.
- امنیت را از اول طراحی کنم، نه آخر سر که همه برای استقرار مدل در پروداکشن و پز دادن به ملت، سراسیمه هستند و بسیار عجول میباشند.
توصیه به کسانی که همین مسیر را میروند
اگر شما هم مثل من از دیتا ساینس شروع کردهاید و حالا احساس میکنید چیزی کم است، شاید MLSecOps همان چیزی باشد که دنبالش هستید. چون کسی که به این فیلد میرسد، بیشک از مهندسی داده و دواپس عبور کرده و تعدادی مدل ساخته و مستقر نموده. اما باز هم با شک و تردید کارش پیش رفته است. به عقیدهی بنده MLSecOps تا حد بسیار زیادی تردیدها را از یک تیم فنی در وادی مدلهای یادگیری ماشین و بطور کلی هوش مصنوعی، میکاهد.
چند توصیه از جنس تجربه:
۱. امنیت را از اول یاد بگیرید، نه آخر سر
من دیر شروع کردم. کاش زودتر میفهمیدم مدلها چقدر آسیبپذیرند.
۲. زیرساخت را دست کم نگیرید
بهترین مدل دنیا بدون خط لوله خوب، فقط یک فایل است.
۳. بین تیمها پل بزنید
دیتا ساینس، مهندسی داده، امنیت – این سه تا باید با هم حرف بزنند. شما میتوانید مترجمشان باشید. چون یکبار پیراهن همهی این افراد را به تن کردهاید.
۴. همیشه به دادهها و مدلها به چشم دارایی حساس نگاه کنید
اگر مدل شما ارزش تجاری دارد، برای دیگران هم ارزش دارد. پس مثل فرزند خود از آن حفاظت کنید. این روزها دارایی افراد حکم جانشان را دارد. شوخی نیست.
جایی که هستم و جایی که میروم
الان مدتی است (زمان دقیق نمیتوانم بگویم) در حوزه MLSecOps کار میکنم. هر روز چیز جدیدی یاد میگیرم.
از آن نیمهشب که مدل اعتبارسنجی خراب شد تا امروز که سیستمهای defensive distillation و adversarial training میسازیم، مسیر طولانی بود. اما بسیار لذت بخش (هم کلی چیز جدید در زندگی میآموزیم و هم کسب درآمد میکنیم. چه چیزی از این بهتر و لذتبخشتر).
اما هر بار که یک حمله را شناسایی میکنیم قبل از اینکه به کاربر آسیب بزند، یا یک آسیبپذیری را قبل از بهرهبرداری پیدا میکنیم، میفهمیم:
این همان جایی است که باید باشم.
نه فقط سازنده مدل.
نه فقط سازنده خط لوله.
محافــــظ و نگهبانـــــی که از هر دو محافظــــــــت و مراقبـــت میکنــــد.
کلام پایانی
این متن طولانی را نوشتم که به اینجا برسم: بحث امنیت در دنیای مدلهای یادگیری ماشین بطور کلی با مباحث سنتی امنیت متفاوت است. تمامی اصول دنیای امنیت در این وادی باید بکار گرفته شود. اما فراتر از آن، باید بفکر امنیت دیتا و لایههای مختلف مدل خود نیز باشیم. چیزی که فراتر از دانش یک متخصص امنیت سایبری است. به عقیدهی بنده این فیلد، جزو رشتهها و حوزههایی است که بزودی و بشدت در مارکت متخصصین جهانی مورد تقاضای بسیار بالا قرار خواهد گرفت.
اگر اهل مطالعهی فراوان، تجربهی چالشهای واقعی و کار در مقیاس بزرگ هستید (این موارد در مقیاس کوچک بیمعناست)، یکی از بهترین فیلدهای حوزهی دیتا MLSecOps است.
نکته: بخشهایی از مقاله را بدلیل ملاحظات کاری مقداری تغییر دادهام.