tensorflow tf.distribute.experimental.rpc.Server memory leak on server

2uluyalo  于 5个月前  发布在  其他
关注(0)|答案(9)|浏览(49)

问题类型

Bug

来源

source

Tensorflow版本

tf 2.11

自定义代码

OS平台和发行版

Ubuntu 20.04

移动设备

  • 无响应*

Python版本

3.8

Bazel版本

  • 无响应*

GCC/编译器版本

  • 无响应*

CUDA/cuDNN版本

11.2/8.1

GPU型号和内存大小

Nvidia GeForce RTX 2070 6233MB

当前行为?

RPC works fine with CPU but when switched to GPU, memory increases linearly.
(Memory stays constant after awhile with CPU)

When training model, memory will keep increasing until desktop freezes.

Code below to reproduce the issue on Google Colab.

独立代码重现问题

# import os
# os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

import tensorflow as tf
import numpy as np
import portpicker
import matplotlib.pyplot as plt

import time
import os
import psutil
process = psutil.Process(os.getpid())

#tf.debugging.set_log_device_placement(True)

def test_simple():

    @tf.function(input_signature=[
        tf.TensorSpec([], tf.int32),
        tf.TensorSpec([], tf.int32)])
    @tf.autograph.experimental.do_not_convert  
    def remote_fn(a, b):
        return tf.add(a,b)

    port = portpicker.pick_unused_port()
    address = "localhost:{}".format(port)
    server = tf.distribute.experimental.rpc.Server.create("grpc", address)
    server.register("addition", remote_fn)
    server.start()

    client = tf.distribute.experimental.rpc.Client.create("grpc",
                address=address, name="test_client")

    a = np.ones(shape=[100, 256], dtype=np.int32)
    b = np.ones(shape=[100, 256], dtype=np.int32)

    hist = []
    for i in range(100000):
        result = client.call(
            args=[a,b],
            method_name="addition",
            output_specs=tf.TensorSpec((), tf.int32))
        if result.is_ok():
            result.get_value()
        # value = client.addition_blocking(a,b)
        # print(value)

        if i % 1000 == 0:
            print(i, ": ", process.memory_info().rss/1024/1024, "MB")
            hist.append(process.memory_info().rss/1024/1024)

    server.close()
    print("After shutdown: ", process.memory_info().rss/1024/1024)
    plt.plot(hist)
    plt.show()

test_simple()

相关日志输出

909000 :  1414.50390625 MB
910000 :  1414.5078125 MB
911000 :  1414.5078125 MB
912000 :  1414.5078125 MB
913000 :  1414.5078125 MB
914000 :  1414.5078125 MB
915000 :  1414.51171875 MB
916000 :  1414.51171875 MB
917000 :  1414.51171875 MB
918000 :  1414.515625 MB
919000 :  1415.6640625 MB
920000 :  1416.796875 MB
921000 :  1416.796875 MB
922000 :  1416.796875 MB
923000 :  1417.75 MB
924000 :  1418.7109375 MB
925000 :  1418.7109375 MB
926000 :  1418.7109375 MB
927000 :  1418.7109375 MB
928000 :  1418.71484375 MB
929000 :  1418.84765625 MB
930000 :  1418.84765625 MB
931000 :  1418.8515625 MB
932000 :  1418.85546875 MB
933000 :  1419.62890625 MB
934000 :  1419.87890625 MB
935000 :  1420.37890625 MB
936000 :  1420.53125 MB
937000 :  1420.65625 MB
938000 :  1421.83984375 MB
939000 :  1421.84375 MB
940000 :  1422.74609375 MB
941000 :  1422.84375 MB
942000 :  1422.84375 MB
943000 :  1423.3515625 MB
944000 :  1423.8984375 MB
945000 :  1423.91015625 MB
946000 :  1425.5078125 MB
947000 :  1426.109375 MB
948000 :  1426.34765625 MB
949000 :  1426.34765625 MB
950000 :  1426.3515625 MB
951000 :  1426.3515625 MB
952000 :  1427.05859375 MB
953000 :  1427.37890625 MB
954000 :  1427.3828125 MB
955000 :  1428.90234375 MB
956000 :  1429.69140625 MB
957000 :  1429.6953125 MB
958000 :  1430.3046875 MB
959000 :  1432.421875 MB
960000 :  1432.421875 MB
961000 :  1432.421875 MB
962000 :  1432.82421875 MB
963000 :  1432.82421875 MB
964000 :  1432.82421875 MB
965000 :  1433.1328125 MB
966000 :  1433.1328125 MB
967000 :  1433.1328125 MB
968000 :  1433.1328125 MB
969000 :  1434.60546875 MB
970000 :  1434.60546875 MB
971000 :  1434.640625 MB
972000 :  1435.08203125 MB
973000 :  1435.0859375 MB
974000 :  1435.59765625 MB
975000 :  1436.98828125 MB
976000 :  1436.9921875 MB
977000 :  1437.125 MB
978000 :  1437.98828125 MB
979000 :  1441.01953125 MB
980000 :  1441.96875 MB
981000 :  1441.96875 MB
982000 :  1441.97265625 MB
983000 :  1441.97265625 MB
984000 :  1441.97265625 MB
985000 :  1441.97265625 MB
986000 :  1441.97265625 MB
987000 :  1441.97265625 MB
988000 :  1441.97265625 MB
989000 :  1441.97265625 MB
990000 :  1441.9765625 MB
991000 :  1441.9765625 MB
992000 :  1441.98046875 MB
993000 :  1444.41796875 MB
994000 :  1444.78515625 MB
995000 :  1444.78515625 MB
996000 :  1444.78515625 MB
997000 :  1446.05078125 MB
998000 :  1446.05078125 MB
999000 :  1446.05078125 MB
After shutdown:  1447.05078125
pxy2qtax

pxy2qtax1#

我尝试在Colab上复现这个问题,使用了TensorFlow v2.11,但遇到了不同的错误。您能否找到gist here作为参考并确认相同的问题?谢谢!

zzoitvuj

zzoitvuj2#

如果你注解掉这两行代码,它应该可以正常运行,不会出现错误:

# server.close()
# print("After shutdown: ", process.memory_info().rss/1024/1024)

但是图形仍然显示内存线性增长。

fafcakar

fafcakar3#

@sushreebarsa
I was able to reproduce the issue on Colab using TF v2.11. Please find the gist here for reference.
Thank you!

elcex8rz

elcex8rz4#

@sushreebarsa@tiruk007 我只是想知道这是否是一个快速的解决方案,还是有什么计划,因为我的项目已经到了截止日期...
谢谢。

6jjcrrmo

6jjcrrmo5#

@YHL04 ,
我测试了代码在CPU和GPU上的表现。即使在CPU上,我也观察到了内存的持续增加,这与您确认的CPU行为相冲突:(Memory stays constant after awhile with CPU)。请参考附件中的gist,在那里我也观察到了相同的行为。请仔细查看并确认这里的CPU行为是否与GPU的行为相同?
谢谢!

flvtvl50

flvtvl506#

未注解:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

TF 2.9 CPU:

TF 2.11 CPU:

我在桌面上的TF 2.11.0 CPU:
已注解掉:

# if result.is_ok():
        #     result.get_value()
        # value = client.addition_blocking(a,b).numpy()

不知道为什么我无法复现相同的结果...

gywdnpxw

gywdnpxw7#

你好,YHL04。

感谢你再次回来确认CPU的行为。正如你也可以确认的那样,CPU和内存的行为都在呈上升趋势,我们可以确认这是否正常吗?你能分享一下你的意见吗?

谢谢!

iq0todco

iq0todco8#

你好@SuryanarayanaY,
我不确定为什么内存会增加,尤其是当它最终冻结了桌面时。每个客户端调用都是独立的,没有理由在客户端调用之后存储任何内容。
如果这种行为是有意为之的,你能解释一下原因吗?

ws51t4hk

ws51t4hk9#

你好,YHL04。
我还没有确认这是否是预期的行为。我的意图是与你确认内存增加的行为是否同时存在于CPU和GPU上?
@sachinprasadhs,请问您能查看一下这个问题吗?
谢谢!

相关问题