কীভাবে জিপিইউ মেমরির সম্পূর্ণতা বরাদ্দ করা থেকে টেনস্রোফ্লো রোধ করা যায়?


282

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

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

টেনসরফ্লো সমস্যাটি হ'ল, ডিফল্টরূপে, এটি চালু হওয়ার সময় উপলব্ধ জিপিইউ মেমরির পুরো পরিমাণ বরাদ্দ করে। এমনকি একটি ছোট দ্বি-স্তরের নিউরাল নেটওয়ার্কের জন্য, আমি দেখতে পাচ্ছি যে সমস্ত জিপিইউ মেমরির 12 জিবি ব্যবহার করা হয়েছে।

টেনসরফ্লোকে কেবলমাত্র জিপিইউ মেমরির 4 জিবি বরাদ্দ করার কোনও উপায় আছে, যদি কেউ জানেন যে প্রদত্ত মডেলের পক্ষে এটি যথেষ্ট?

উত্তর:


292

GP চ্ছিক আর্গুমেন্টের অংশ হিসাবে tf.Sessionপাস করার মাধ্যমে আপনি কোনও জিপিইউ মেমরির ভগ্নাংশ নির্ধারণ করতে পারবেন :tf.GPUOptionsconfig

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

per_process_gpu_memory_fractionএকটি হার্ড হিসাবে কাজ উপরের যে একই মেশিনে প্রতিটি GPU এর মাধ্যমে প্রক্রিয়া দ্বারা ব্যবহার করা হবে GPU মেমরিতে পরিমাণের আবদ্ধ। বর্তমানে, এই ভগ্নাংশটি একই মেশিনে সমস্ত জিপিইউতে অভিন্নভাবে প্রয়োগ করা হয়; প্রতি-জিপিইউ ভিত্তিতে এটি সেট করার কোনও উপায় নেই।


3
আপনাকে অনেক ধন্যবাদ. এই তথ্যটি বর্তমান নথিতে বেশ গোপন রয়েছে। আমি নিজেই এটি কখনই খুঁজে পেতাম না :-) আপনি যদি উত্তর দিতে পারেন তবে আমি আরও দুটি অতিরিক্ত ইনফোসের জন্য জিজ্ঞাসা করতে চাই: 1- এটি কি কখনও ব্যবহৃত মেমরির পরিমাণকে সীমাবদ্ধ করে না, বা কেবল স্মৃতিটিকে প্রাথমিকভাবে বরাদ্দ করা হয়? (উদাহরণস্বরূপ, যদি গণনার গ্রাফ দ্বারা এটির প্রয়োজন হয় তবে এটি আরও মেমরি বরাদ্দ করবে) 2- প্রতি-জিপিইউ ভিত্তিতে এটি সেট করার কোনও উপায় আছে কি?
ফ্যাবিয়ান সি

15
সম্পর্কিত নোট: টেনসরফ্লোকে একক জিপিইউতে সীমাবদ্ধ করার জন্য CUDA_VISIBLE_DEVICES সেট করা আমার পক্ষে কাজ করে। দেখুন acceleware.com/blog/cudavisibledevices-masking-gpus
rd11

2
মনে হচ্ছে মেমোরির বরাদ্দ অনুরোধের চেয়ে কিছুটা এগিয়ে গেছে, e..g আমি 24443MiB জিপিইউতে পের_প্রসেস_জিপু_মেমরি_ফ্রাকশন = 0.0909 এর জন্য অনুরোধ করেছি এবং 2627MiB
jeremy_rutman

2
এটিকে আমি কাজ করতে পারি বলে মনে হচ্ছে নাMonitoredTrainingSession
আনজুম সায়েদ

2
@ জেরেমি_রুটম্যান আমি বিশ্বাস করি এটি চুদন এবং কিউব্লাস প্রসঙ্গে প্রারম্ভিকতার কারণে। এটি কেবলমাত্র তখনই প্রাসঙ্গিক যে আপনি যদি কার্নেলগুলি ব্যবহার করে যা এইসব লিব ব্যবহার করে।
ড্যানিয়েল

186
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)

https://github.com/tensorflow/tensorflow/issues/1578


13
এইটি হ'ল আমি যা চাই ঠিক তাই কারণ একটি বহু-ব্যবহারকারী পরিবেশে, কোডটি নিজেই সংরক্ষণ করতে জিপিইউ মেমরির সঠিক পরিমাণ উল্লেখ করা খুব অসুবিধাজনক।
xuancong84

4
এছাড়াও, আপনি যদি টিএফ ব্যাকএন্ডের সাহায্যে কেরাস ব্যবহার করছেন তবে আপনি এটি ব্যবহার করে চালাতে পারেন from keras import backend as Kএবং K.set_session(sess)মেমরির সীমাবদ্ধতা এড়াতে
অলিভার

50

এখানে বইয়ের একটি অংশ রয়েছে Deep Learning with TensorFlow

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

1) বৃদ্ধির অনুমতি দিন: (আরও নমনীয়)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

দ্বিতীয় পদ্ধতিটি হ'ল per_process_gpu_memory_fractionবিকল্প, যা মেমরির সামগ্রিক পরিমাণের ভগ্নাংশ নির্ধারণ করে যে eachদৃশ্যমান জিপিইউ বরাদ্দ করা উচিত। বিঃদ্রঃ: মেমরির কোনও প্রকাশের প্রয়োজন নেই, এটি হয়ে গেলে মেমরির খণ্ডনকে আরও খারাপ করতে পারে।

2) স্থির মেমরি বরাদ্দ :

40%প্রতিটি জিপিইউর মোট স্মৃতি কেবলমাত্র এর জন্য বরাদ্দ করতে :

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

দ্রষ্টব্য: এটি কেবলমাত্র কার্যকর যদি আপনি টেনসরফ্লো প্রক্রিয়াতে উপলব্ধ জিপিইউ মেমরির পরিমাণটি সত্যিকারভাবে আবদ্ধ করতে চান।


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

25

টেনসরফ্লো ২.০ আলফা এবং তার বাইরেও আপডেট হয়েছে

2.0 আলফা ডক্স থেকে, টেনসরফ্লো দিয়ে আপনি কিছু করার আগে উত্তরটি এখন কেবল একটি লাইন:

import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)

1
@ অক্ষয়লরাধ্য্যা কোনটিই কেবল টিএফ ২.০ এবং তারপরের জন্য নয়। এখানে অন্যান্য উত্তরগুলি 1.13 এবং তার আগের জন্য ভাল কাজ করবে।
থিও

19

উপরের সমস্ত উত্তর a সহ নির্বাহকে ধরে নিয়েছে sess.run() কল , যা টেনসরফ্লো এর সাম্প্রতিক সংস্করণগুলিতে নিয়মের পরিবর্তে ব্যতিক্রম হয়ে উঠছে।

tf.Estimatorফ্রেমওয়ার্কটি ব্যবহার করার সময় (টেনসরফ্লো 1.4 এবং উপরে) স্পষ্টতভাবে তৈরি MonitoredTrainingSessionকরা ভগ্নাংশটি পাস করার উপায়টি হ'ল,

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
trainingConfig = tf.estimator.RunConfig(session_config=conf, ...)
tf.estimator.Estimator(model_fn=..., 
                       config=trainingConfig)

একইভাবে ইজিার মোডে (টেনসরফ্লো 1.5 এবং উপরে),

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
tfe.enable_eager_execution(config=conf)

সম্পাদনা করুন: 11-04-2018 উদাহরণস্বরূপ, আপনি যদি ব্যবহার করতে চান তবে আপনি বেলোtf.contrib.gan.train অনুরূপ কিছু ব্যবহার করতে পারেন:

tf.contrib.gan.gan_train(........, config=conf)

16

টেনসরফ্লো সংস্করণ ২.০ এবং ২.১ এর জন্য নিম্নলিখিত স্নিপেট ব্যবহার করুন :

 import tensorflow as tf
 gpu_devices = tf.config.experimental.list_physical_devices('GPU')
 tf.config.experimental.set_memory_growth(gpu_devices[0], True)

পূর্ববর্তী সংস্করণগুলির জন্য , নিম্নলিখিত স্নিপেটটি আমার জন্য কাজ করত:

import tensorflow as tf
tf_config=tf.ConfigProto()
tf_config.gpu_options.allow_growth=True
sess = tf.Session(config=tf_config)

10

টেনসরফ্লো 2.0 বিটা এবং (সম্ভবত) এর বাইরে

এপিআই আবার পরিবর্তন হয়েছে। এটি এখন পাওয়া যাবে:

tf.config.experimental.set_memory_growth(
    device,
    enable
)

ওরফে:

  • tf.compat.v1.config.experimental.set_memory_growth
  • tf.compat.v2.config.experimental.set_memory_growth

তথ্যসূত্র:

এটিও দেখুন: টেনস্রোফ্লো - একটি জিপিইউ ব্যবহার করুন : https://www.tensorflow.org/guide/gpu

টেনসরফ্লো ২.০ আলফা দেখুন: এই উত্তর


8

তুমি ব্যবহার করতে পার

TF_FORCE_GPU_ALLOW_GROWTH=true

আপনার পরিবেশে পরিবর্তনশীল।

ইন tensorflow কোড:

bool GPUBFCAllocator::GetAllowGrowthValue(const GPUOptions& gpu_options) {
  const char* force_allow_growth_string =
      std::getenv("TF_FORCE_GPU_ALLOW_GROWTH");
  if (force_allow_growth_string == nullptr) {
    return gpu_options.allow_growth();
}

5

নির্লজ্জ প্লাগ: আপনি যদি জিপিইউ সমর্থিত টেনসরফ্লো ইনস্টল করেন তবে সেশনটি প্রথমে সমস্ত সিপিইউ বরাদ্দ করবে আপনি এটি কেবল সিপিইউ বা জিপিইউ ব্যবহারের জন্য সেট করেছেন কিনা। আমি আমার টিপটি যোগ করতে পারি যে এমনকি আপনি সিপিইউ ব্যবহার করতে গ্রাফটি সেট করেছেন কেবল অযাচিত জিপিইউ দখল রোধ করতে আপনার একই কনফিগারেশনটি (উপরে উত্তর হিসাবে :) সেট করা উচিত।

আইপিথনের মত ইন্টারেক্টিভ ইন্টারফেসে আপনারও সেই কনফিগারেশনটি সেট করা উচিত, অন্যথায় এটি সমস্ত মেমরি বরাদ্দ করবে এবং অন্যদের জন্য প্রায় কিছুই রাখবে না। এটি কখনও কখনও লক্ষ্য করা কঠিন।


3

জন্য Tensorflow 2.0 এই এই সমাধান আমার জন্য কাজ করেন। (টিএফ-জিপিইউ 2.0, উইন্ডোজ 10, জিফোর্স আরটিএক্স 2070)

physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
tf.config.experimental.set_memory_growth(physical_devices[0], True)

1
আমি টিএফ-জিপিইউ 2.0, উবুন্টু 16.04.6, টেসলা কে 80 ব্যবহার করছি।
আজর

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

3

আপনি যদি টেনসরফ্লো 2 ব্যবহার করে থাকেন তবে নিম্নলিখিত চেষ্টা করে দেখুন:

config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)

টেনসরফ্লো 2 এর জন্য কাজ করুন
মবিন আলহসান

1

আমি ভেট ডেটা সেটটিতে ইউনেটকে প্রশিক্ষণের চেষ্টা করেছি কিন্তু বিশাল চিত্রের আকারের কারণে, মেমরিটি শেষ হয়। আমি উপরের সমস্ত টিপস চেষ্টা করেছি, এমনকি ব্যাচের আকার == 1 দিয়ে চেষ্টা করেছি, তবে কোনও উন্নতি হয়নি। কখনও কখনও টেনসরফ্লো সংস্করণ মেমরির সমস্যার কারণও হয়। ব্যবহার করে চেষ্টা করুন

পাইপ ইনস্টল টেনসরফ্লো-জিপিইউ == 1.8.0


1

আচ্ছা আমি টেনস্রোফ্লোতে নতুন, আমার জেফোর্স 740 মি বা 2 জিপি র‌্যাম সহ কিছু জিপিইউ আছে, আমি 38700 চিত্র এবং 4300 টেস্টিং চিত্রের প্রশিক্ষণ ডেটা সহ একটি স্থানীয় ভাষার উদাহরণস্বরূপ হস্তাক্ষর দ্বারা চালিত ছিল এবং নির্ভুলতা পাওয়ার জন্য চেষ্টা করছিলাম, প্রত্যাহার, এফ 1 নীচের কোডটি স্কেলনার হিসাবে ব্যবহার করে আমাকে সঠিক ফলাফল দেয় না। একবার আমি আমার বিদ্যমান কোডটিতে এটি যুক্ত করলে আমি জিপিইউ ত্রুটি পেতে শুরু করি।

TP = tf.count_nonzero(predicted * actual)
TN = tf.count_nonzero((predicted - 1) * (actual - 1))
FP = tf.count_nonzero(predicted * (actual - 1))
FN = tf.count_nonzero((predicted - 1) * actual)

prec = TP / (TP + FP)
recall = TP / (TP + FN)
f1 = 2 * prec * recall / (prec + recall)

প্লাস আমার মডেলটি ভারী ছিল আমার অনুমান, আমি 147, 148 যুগের পরে স্মৃতি ত্রুটি পেয়েছি, এবং তখন আমি ভেবেছিলাম কেন কাজগুলির জন্য ফাংশন তৈরি করব না তাই আমি টেনারফ্লোতে এইভাবে কাজ করে কিনা তা আমি জানি না, তবে আমি ভেবেছিলাম কোনও স্থানীয় পরিবর্তনশীল কিনা ব্যবহৃত হয়েছে এবং সুযোগের বাইরে থাকলে এটি মেমরি ছেড়ে দিতে পারে এবং আমি মডিউলগুলিতে প্রশিক্ষণ এবং পরীক্ষার জন্য উপরের উপাদানগুলি সংজ্ঞায়িত করেছি, আমি কোনও সমস্যা ছাড়াই 10000 যুগকে অর্জন করতে সক্ষম হয়েছি, আমি আশা করি এটি সাহায্য করবে ..


টিএফ এর ইউটিলিটিটি দেখে আমি বিস্মিত হয়েছি তবে এটির স্মৃতি ব্যবহারের দ্বারাও। সিপিইউ পাইথনটিতে 30 জিবি বরাদ্দ করা হয় বা ফুলের ডেটাসেটে প্রশিক্ষণ কাজের জন্য টিএফ উদাহরণগুলিতে ব্যবহৃত হতে পারে। উন্মাদ।
এরিক এম

1
# allocate 60% of GPU memory 
from keras.backend.tensorflow_backend import set_session
import tensorflow as tf 
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6
set_session(tf.Session(config=config))

প্রদত্ত উত্তরটি নিম্ন মানের পোস্ট হিসাবে পর্যালোচনার জন্য পতাকাঙ্কিত করা হয়েছিল। আমি কীভাবে একটি ভাল উত্তর লিখতে পারি তার জন্য এখানে কিছু গাইডলাইন রয়েছে ? । এই প্রদত্ত উত্তরটি সঠিক হতে পারে, তবে এটি একটি ব্যাখ্যা থেকে উপকৃত হতে পারে। কোডের উত্তরগুলিকে "ভাল" উত্তর হিসাবে বিবেচনা করা হয় না। পর্যালোচনা থেকে ।
ট্রেনটন ম্যাককিনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.