Update, có thể sử dụng ops TensorFlow để truy vấn cấp phát:
# maximum across all sessions and .run calls so far
sess.run(tf.contrib.memory_stats.MaxBytesInUse())
# current usage
sess.run(tf.contrib.memory_stats.BytesInUse())
Ngoài ra bạn có thể nhận được thông tin chi tiết về session.run
cuộc gọi bao gồm tất cả các bộ nhớ được phân bổ trong run
cuộc gọi bằng cách nhìn vào RunMetadata
. IE một cái gì đó như thế này
run_metadata = tf.RunMetadata()
sess.run(c, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, output_partition_graphs=True), run_metadata=run_metadata)
Dưới đây là một ví dụ end-to-end - mất vector cột, vector hàng và thêm chúng để có được một ma trận bổ sung:
import tensorflow as tf
no_opt = tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0,
do_common_subexpression_elimination=False,
do_function_inlining=False,
do_constant_folding=False)
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=no_opt),
log_device_placement=True, allow_soft_placement=False,
device_count={"CPU": 3},
inter_op_parallelism_threads=3,
intra_op_parallelism_threads=1)
sess = tf.Session(config=config)
with tf.device("cpu:0"):
a = tf.ones((13, 1))
with tf.device("cpu:1"):
b = tf.ones((1, 13))
with tf.device("cpu:2"):
c = a+b
sess = tf.Session(config=config)
run_metadata = tf.RunMetadata()
sess.run(c, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, output_partition_graphs=True), run_metadata=run_metadata)
with open("/tmp/run2.txt", "w") as out:
out.write(str(run_metadata))
Nếu bạn mở run.txt
bạn' ll xem các tin nhắn như thế này:
node_name: "ones"
allocation_description {
requested_bytes: 52
allocator_name: "cpu"
ptr: 4322108320
}
....
node_name: "ones_1"
allocation_description {
requested_bytes: 52
allocator_name: "cpu"
ptr: 4322092992
}
...
node_name: "add"
allocation_description {
requested_bytes: 676
allocator_name: "cpu"
ptr: 4492163840
Vì vậy, ở đây bạn có thể thấy rằng a
và b
phân bổ mỗi 52 byte (13 * 4), và kết quả phân bổ 676 byte.
Có cách nào thuận tiện để nắm bắt phân bổ toàn bộ thiết bị không? Bằng cách này tôi có nghĩa là những gì tỷ lệ bộ nhớ miễn phí của thiết bị của tôi đã được phân bổ? –
không phải là tôi biết. Tôi vừa thêm tất cả các thông báo phân bổ và trừ đi các thông điệp phân bổ từ các bản ghi chi tiết. Có thể là yêu cầu tính năng tốt nếu bạn có trường hợp sử dụng –
BTW, trong C++ API có [cuộc gọi này] (https://github.com/tensorflow/tensorflow/blob/64edd34ce69b4a8033af5d217cb8894105297d8a/tensorflow/core/kernels/stack_ops.cc# L223) cho phép xem tổng bộ nhớ được cấp phát. Dường như nó không được bao bọc để có thể truy cập từ Python, đó sẽ là một tính năng bổ sung tốt –