در دنیای مدرن توسعه نرمافزار، پردازشهای موازی و مدیریت منابع سیستم از اهمیت ویژهای برخوردار هستند. بهویژه زمانی که با دادههای بزرگ و پیچیده سروکار داریم، باید از روشهای بهینهسازی برای کاهش زمان پردازش و استفاده بهینه از منابع سیستم بهره ببریم. در این مقاله به معرفی روشی خواهیم پرداخت که با استفاده از Worker Threads، Bull Queue و Garbage Collection دستی در فریمورک NestJS به بهینهسازی پردازشهای موازی پرداخته است.
هدف اصلی این مقاله نشان دادن نحوهی استفاده از این تکنیکها برای پردازش دادهها بهصورت موازی و بهینهسازی مصرف حافظه در یک سیستم هوش مصنوعی است که از مدلهای مختلف یادگیری ماشین همچون XGBoost، Decision Tree و Neural Networks بهره میبرد. این پکیج به توسعهدهندگان این امکان را میدهد تا مدلهای پیچیده یادگیری ماشین را بهطور کارآمدتر اجرا کنند و منابع سیستم را به شکل بهینهتری مدیریت نمایند.
نکته مهم: در تهیه این مقاله از هوش مصنوعی کمک گرفته شده است
در برنامههای پیچیده که نیاز به پردازش موازی دارند، Worker Threads یک راهکار بسیار مؤثر برای تقسیم بار پردازشی بین چندین نخ است. با استفاده از این تکنیک، میتوان پردازشهای مختلف را بهطور همزمان انجام داد، که به این ترتیب زمان پردازش کاهش مییابد و منابع سیستم بهطور بهینهتری استفاده میشوند.
در این مقاله، برای پردازش مدلهای یادگیری ماشین بهطور موازی از Worker Threads استفاده شده است. به این صورت که هر مدل بهطور جداگانه در یک Worker خاص اجرا میشود و این کار باعث افزایش کارایی و کاهش زمان پردازش در مقایسه با پردازشهای تکنخی میشود.
برای مدیریت صف پردازشها و تخصیص کار به Workerهای مختلف، از Bull Queue استفاده شده است. این صف بهطور هوشمند پردازشها را بین Workers توزیع میکند و به ما این امکان را میدهد که پردازشها را بهصورت موازی انجام دهیم و منابع سیستم را بهطور بهینه مصرف کنیم.
این تکنیک بهویژه در هنگام پردازش دادههای بزرگ یا اجرای مدلهای پیچیده مفید است، زیرا بهطور کارآمدی پردازشها را به نوبت اجرا میکند و از بروز مشکلاتی نظیر Overload در منابع جلوگیری مینماید.
یکی از مشکلات رایج در سیستمهای با پردازشهای پیچیده، مصرف بیش از حد حافظه است. این امر میتواند به کاهش عملکرد سیستم منجر شود و حتی در برخی موارد موجب کرش شدن برنامه شود. برای رفع این مشکل، در این مقاله از Garbage Collection استفاده شده است.
با استفاده از این روش، حافظه غیرضروری که دیگر استفاده نمیشود، بهطور دستی آزاد میشود و از نشت حافظه جلوگیری میشود. برای فعالسازی Garbage Collection در Node.js، از دستور --expose-gc استفاده میکنیم که اجازه میدهد Garbage Collection بهصورت دستی فراخوانی شود.
در زیر کد نمونهای برای پیادهسازی یک پکیج عمومی در NestJS آورده شده است که بهطور خاص برای استفاده از مدلهای مختلف یادگیری ماشین مانند XGBoost، Decision Tree و Neural Networks طراحی شده است:
import { Injectable } from '@nestjs/common';
import * as tf from '@tensorflow/tfjs-node';
import * as xgboost from 'xgboost';
import { DecisionTreeClassifier } from 'decision-tree-classifier';
import { SGDClassifier } from 'scikit-learn'; // اضافه کردن الگوریتم یادگیری آنلاین
import * as process from 'process';
@Injectable()
export class AiService {
private models: { [key: string]: any } = {};
// ساخت مدلهای مختلف بهصورت عمومی
createModel(modelType: string, modelOptions: any) {
switch (modelType) {
case 'XGBoost':
this.models[modelType] = new xgboost.XGBClassifier(modelOptions);
break;
case 'DecisionTree':
this.models[modelType] = new DecisionTreeClassifier(modelOptions);
break;
case 'NeuralNetwork':
this.models[modelType] = tf.sequential(); // مدل شبکه عصبی
break;
case 'SGDClassifier': // مدل یادگیری آنلاین
this.models[modelType] = new SGDClassifier(modelOptions);
break;
default:
throw new Error('Model type not supported');
}
}
// آموزش مدل
async trainModel(modelType: string, data: number[][], labels: number[], batchSize: number = 32) {
const model = this.models[modelType];
if (!model) {
throw new Error('Model not created');
}
if (modelType === 'XGBoost' || modelType === 'DecisionTree') {
await model.fit(data, labels);
} else if (modelType === 'NeuralNetwork') {
// آموزش شبکه عصبی با استفاده از batching
const xs = tf.tensor(data);
const ys = tf.tensor(labels);
model.add(tf.layers.dense({ units: 10, inputShape: [data[0].length] }));
model.compile({ optimizer: 'adam', loss: 'meanSquaredError' });
// استفاده از batching برای آموزش بهینهتر
await model.fit(xs, ys, {
epochs: 10,
batchSize: batchSize,
});
} else if (modelType === 'SGDClassifier') {
// آموزش مدل یادگیری آنلاین
await model.fit_one_batch(data, labels);
}
}
// پیشبینی با مدل
async predict(modelType: string, data: number[][], batchSize: number = 32) {
const model = this.models[modelType];
if (!model) {
throw new Error('Model not created');
}
if (modelType === 'XGBoost' || modelType === 'DecisionTree' || modelType === 'SGDClassifier') {
return await model.predict(data);
} else if (modelType === 'NeuralNetwork') {
const xs = tf.tensor(data);
// استفاده از batching برای پیشبینی بهینهتر
return model.predict(xs).dataSync();
}
}
// مدیریت Garbage Collection دستی
private manageGarbageCollection() {
// بررسی مصرف حافظه و فعالسازی Garbage Collection دستی در صورت نیاز
const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024; // حافظه مصرفی به MB
console.log(`Memory Usage: ${memoryUsage.toFixed(2)} MB`);
// اگر مصرف حافظه بیش از حد باشد، GC فراخوانی میشود
if (memoryUsage > 500) { // مقدار آستانه مصرف حافظه را بسته به نیاز خود تغییر دهید
console.log('Memory usage high, triggering GC...');
global.gc(); // فراخوانی دستی GC
}
}
// حذف مدلها برای آزادسازی منابع
deleteModel(modelType: string) {
delete this.models[modelType];
this.manageGarbageCollection(); // فراخوانی GC پس از حذف مدل
}
}
1. ساخت مدلها:
برای ایجاد مدلها، شما میتوانید نوع مدل و پارامترهای تنظیمات آن را از کاربر دریافت کنید:
// برای ایجاد مدل XGBoost
this.aiService.createModel('XGBoost', { max_depth: 6, learning_rate: 0.1 });
// برای ایجاد مدل Decision Tree
this.aiService.createModel('DecisionTree', { max_depth: 10 });
// برای ایجاد مدل شبکه عصبی
this.aiService.createModel('NeuralNetwork', {});
2. آموزش مدلها:
پس از ایجاد مدلها، میتوانید آنها را آموزش دهید:
await this.aiService.trainModel('XGBoost', data, labels);
await this.aiService.trainModel('DecisionTree', data, labels);
await this.aiService.trainModel('NeuralNetwork', data, labels);
3. پیشبینی با مدلها:
برای پیشبینی با مدلهای مختلف:
const xgboostPredictions = await this.aiService.predict('XGBoost', testData);
const decisionTreePredictions = await this.aiService.predict('DecisionTree', testData);
const neuralNetworkPredictions = await this.aiService.predict('NeuralNetwork', testData);
4. حذف مدل:
زمانی که مدل دیگر مورد استفاده نیست، میتوانید آن را حذف کنید:
this.aiService.deleteModel('XGBoost');
this.aiService.deleteModel('DecisionTree');
this.aiService.deleteModel('NeuralNetwork');
نتیجهگیری
در این مقاله، تکنیکهایی مانند Worker Threads، Bull Queue و Garbage Collection برای بهینهسازی پردازشهای موازی و مدیریت منابع در سیستمهای هوش مصنوعی بررسی شد. این روشها بهویژه در شرایطی که با دادههای بزرگ سروکار داریم، میتوانند عملکرد سیستم را بهطور چشمگیری بهبود بخشند. با استفاده از این تکنیکها، میتوان پردازشهای موازی را بهصورت کارآمد انجام داد و مصرف حافظه را به حداقل رساند.
این روشها نه تنها موجب بهینهسازی منابع میشوند بلکه در مقیاسهای بزرگتر، قابلیت مقیاسپذیری بالاتری را فراهم میآورند. این پکیج میتواند در مقیاسهای کوچک تا متوسط (1,000 تا 10,000 کاربر همزمان) عملکرد مناسبی داشته باشد. برای مقیاسهای بزرگتر، نیاز به بهینهسازی بیشتر منابع و مقیاسپذیری بهتر است.