From 4cbf362fc67f52cea34d3b587bbeb334fb21df44 Mon Sep 17 00:00:00 2001 From: Luke Bollam Date: Wed, 1 Sep 2021 11:32:59 +0800 Subject: [PATCH 1/4] adding saved model cleanup benchmark --- .../Leak/SavedModelCleanup.cs | 31 ++++++++++++++++++ .../Leak/TestModel/saved_model/saved_model.pb | Bin 0 -> 24775 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 1465 bytes .../saved_model/variables/variables.index | Bin 0 -> 274 bytes .../Tensorflow.Benchmark.csproj | 16 +++++++++ 5 files changed, 47 insertions(+) create mode 100644 src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs create mode 100644 src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/saved_model.pb create mode 100644 src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.data-00000-of-00001 create mode 100644 src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.index diff --git a/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs new file mode 100644 index 00000000..e9e1e75f --- /dev/null +++ b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs @@ -0,0 +1,31 @@ +using BenchmarkDotNet.Attributes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Tensorflow.Benchmark.Leak +{ + + public class SavedModelCleanup + { + [Benchmark] + public void Run() + { + var modelDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + var ClassifierModelPath = Path.Combine(modelDir, "Leak", "TestModel", "saved_model"); + + for (var i = 0; i < 1000; i++) + { + var session = Session.LoadFromSavedModel(ClassifierModelPath); + + session.graph.Exit(); + session.graph.Dispose(); + session.Dispose(); + } + } + } +} diff --git a/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/saved_model.pb b/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..f75f28564731f1d6bf48b02c41d8d304881b5e70 GIT binary patch literal 24775 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 literal 0 HcmV?d00001 diff --git a/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.data-00000-of-00001 b/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..4c7f99dbacb2456aa9893d404a996e02b588ce42 GIT binary patch literal 1465 zcmd0sf7fo;&Zm18GMwF8>)O2UbGzKW9YwUfyiBZ4+N(w3O@)7L z|Jyv@>$p_Vj{n`eV;SlSaFL zzuN7VXlC0b&MLOuw>H%F`b9BYkIRvEzcp{~6|VkZyYX&=-T8k>`&OE7+S?nt$*$Te z&h9~Q!@jyTEc>i_x$QbdlkK`@G43t3kJ`7B*~2cFeTtoMv9sOI=PI^7(Fbg!C!gMv z@pH|dAJeOLd3v3;{a3?jJEPrf?>pv|dv|WqvTeNnW{)bf$zBE^XnbR`C+CLh-cJsF zyC2K3?ETDc@Y92htC5k5n}bn^JuNe*B(3I z6Ec7b1ccat?#xTg0Xjuch$SgAu^8wSAzV%o#_bdlRHuj{+s4Pm3bcvQ07wZ6F&YBx zMi*Jj$R)@jCd8YQSeaTBpPLGdkYtcca0H4xhq#b5L@oB9AwJZkIV6O{^MH|!E%3QH zB!$>vuHoX45@G{eTFk`{418&1FEVh23I%iVg*gU!Iy(8d#)mojgt`g|0+WY6DEtjm z^daFar3XzhU}31BzMf-9NRX#fXozdDKB^I1fkOTm#_}T>3yLx+9TY=BLimhC4}2Wa tA%htmI1+|Dhb*D!AU5SlbI9R~4teD0P=H4VEJv{eQy3>Gp}_=zGytKt^)dhe literal 0 HcmV?d00001 diff --git a/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.index b/src/TensorFlowNet.Benchmarks/Leak/TestModel/saved_model/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..ee0efb7c0c418c80c8493ce4c605384820ba484e GIT binary patch literal 274 zcmZQzVB=tvV&Y(Akl~Ma_HcFf4)FK%3vqPvagFzP@^W + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + From b3d08626f66d912012243e79505af66bdf79f2d6 Mon Sep 17 00:00:00 2001 From: Luke Bollam Date: Wed, 1 Sep 2021 11:38:09 +0800 Subject: [PATCH 2/4] less loops so it doesnt waste so much time --- src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs index e9e1e75f..36b2c0ba 100644 --- a/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs +++ b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs @@ -18,7 +18,7 @@ namespace Tensorflow.Benchmark.Leak var modelDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var ClassifierModelPath = Path.Combine(modelDir, "Leak", "TestModel", "saved_model"); - for (var i = 0; i < 1000; i++) + for (var i = 0; i < 50; i++) { var session = Session.LoadFromSavedModel(ClassifierModelPath); From 85139ed131350b48617503a2fec05808ed03c75e Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Sat, 4 Sep 2021 09:31:29 -0500 Subject: [PATCH 3/4] Fix Session.LoadFromSavedModel memroy leak. --- src/TensorFlowNET.Core/Graphs/c_api.graph.cs | 2 +- .../Sessions/BaseSession.cs | 14 ++-- src/TensorFlowNET.Core/Sessions/Session.cs | 70 ++++++------------- .../Sessions/c_api.session.cs | 12 ++++ .../Leak/SavedModelCleanup.cs | 11 ++- src/TensorFlowNet.Benchmarks/Program.cs | 4 +- .../Tensorflow.Benchmark.csproj | 2 +- 7 files changed, 52 insertions(+), 63 deletions(-) diff --git a/src/TensorFlowNET.Core/Graphs/c_api.graph.cs b/src/TensorFlowNET.Core/Graphs/c_api.graph.cs index 2f5af971..6eb8f367 100644 --- a/src/TensorFlowNET.Core/Graphs/c_api.graph.cs +++ b/src/TensorFlowNET.Core/Graphs/c_api.graph.cs @@ -289,7 +289,7 @@ namespace Tensorflow [DllImport(TensorFlowLibName)] public static extern IntPtr TF_LoadSessionFromSavedModel(SafeSessionOptionsHandle session_options, IntPtr run_options, string export_dir, string[] tags, int tags_len, - IntPtr graph, ref TF_Buffer meta_graph_def, SafeStatusHandle status); + IntPtr graph, IntPtr meta_graph_def, SafeStatusHandle status); [DllImport(TensorFlowLibName)] public static extern IntPtr TF_NewGraph(); diff --git a/src/TensorFlowNET.Core/Sessions/BaseSession.cs b/src/TensorFlowNET.Core/Sessions/BaseSession.cs index 3c994a6e..a740226f 100644 --- a/src/TensorFlowNET.Core/Sessions/BaseSession.cs +++ b/src/TensorFlowNET.Core/Sessions/BaseSession.cs @@ -36,6 +36,12 @@ namespace Tensorflow protected byte[] _target; public Graph graph => _graph; + public BaseSession(IntPtr handle, Graph g) + { + _handle = handle; + _graph = g ?? ops.get_default_graph(); + } + public BaseSession(string target = "", Graph g = null, ConfigProto config = null, Status status = null) { _graph = g ?? ops.get_default_graph(); @@ -291,12 +297,8 @@ namespace Tensorflow protected override void DisposeUnmanagedResources(IntPtr handle) { - lock (Locks.ProcessWide) - using (var status = new Status()) - { - c_api.TF_DeleteSession(handle, status.Handle); - status.Check(true); - } + // c_api.TF_CloseSession(handle, tf.Status.Handle); + c_api.TF_DeleteSession(handle, tf.Status.Handle); } } } diff --git a/src/TensorFlowNET.Core/Sessions/Session.cs b/src/TensorFlowNET.Core/Sessions/Session.cs index c48715a2..1e94b882 100644 --- a/src/TensorFlowNET.Core/Sessions/Session.cs +++ b/src/TensorFlowNET.Core/Sessions/Session.cs @@ -26,10 +26,8 @@ namespace Tensorflow public Session(string target = "", Graph g = null) : base(target, g, null) { } - public Session(IntPtr handle, Graph g = null) : base("", g, null) - { - _handle = handle; - } + public Session(IntPtr handle, Graph g = null) : base(handle, g) + { } public Session(Graph g, ConfigProto config = null, Status s = null) : base("", g, config, s) { } @@ -39,51 +37,29 @@ namespace Tensorflow return ops.set_default_session(this); } - [MethodImpl(MethodImplOptions.NoOptimization)] public static Session LoadFromSavedModel(string path) { - lock (Locks.ProcessWide) - { - var graph = c_api.TF_NewGraph(); - using var status = new Status(); - var opt = new SessionOptions(); - - var tags = new string[] { "serve" }; - var buffer = new TF_Buffer(); - - IntPtr sess; - try - { - sess = c_api.TF_LoadSessionFromSavedModel(opt.Handle, - IntPtr.Zero, - path, - tags, - tags.Length, - graph, - ref buffer, - status.Handle); - status.Check(true); - } - catch (TensorflowException ex) when (ex.Message.Contains("Could not find SavedModel")) - { - sess = c_api.TF_LoadSessionFromSavedModel(opt.Handle, - IntPtr.Zero, - Path.GetFullPath(path), - tags, - tags.Length, - graph, - ref buffer, - status.Handle); - status.Check(true); - } - - // load graph bytes - // var data = new byte[buffer.length]; - // Marshal.Copy(buffer.data, data, 0, (int)buffer.length); - // var meta_graph = MetaGraphDef.Parser.ParseFrom(data);*/ - - return new Session(sess, g: new Graph(graph)).as_default(); - } + using var graph = new Graph(); + using var status = new Status(); + using var opt = c_api.TF_NewSessionOptions(); + + var tags = new string[] { "serve" }; + + var sess = c_api.TF_LoadSessionFromSavedModel(opt, + IntPtr.Zero, + path, + tags, + tags.Length, + graph, + IntPtr.Zero, + status.Handle); + status.Check(true); + + // load graph bytes + // var data = new byte[buffer.length]; + // Marshal.Copy(buffer.data, data, 0, (int)buffer.length); + // var meta_graph = MetaGraphDef.Parser.ParseFrom(data);*/ + return new Session(sess, g: graph); } public static implicit operator IntPtr(Session session) => session._handle; diff --git a/src/TensorFlowNET.Core/Sessions/c_api.session.cs b/src/TensorFlowNET.Core/Sessions/c_api.session.cs index 8ac4d53e..548d79e7 100644 --- a/src/TensorFlowNET.Core/Sessions/c_api.session.cs +++ b/src/TensorFlowNET.Core/Sessions/c_api.session.cs @@ -21,6 +21,18 @@ namespace Tensorflow { public partial class c_api { + /// + /// Close a session. + /// + /// Contacts any other processes associated with the session, if applicable. + /// May not be called after TF_DeleteSession(). + /// + /// + /// + + [DllImport(TensorFlowLibName)] + public static extern void TF_CloseSession(IntPtr session, SafeStatusHandle status); + /// /// Destroy a session object. /// diff --git a/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs index 36b2c0ba..5cdb28f7 100644 --- a/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs +++ b/src/TensorFlowNet.Benchmarks/Leak/SavedModelCleanup.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; +using static Tensorflow.Binding; namespace Tensorflow.Benchmark.Leak { @@ -18,13 +19,9 @@ namespace Tensorflow.Benchmark.Leak var modelDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var ClassifierModelPath = Path.Combine(modelDir, "Leak", "TestModel", "saved_model"); - for (var i = 0; i < 50; i++) - { - var session = Session.LoadFromSavedModel(ClassifierModelPath); - - session.graph.Exit(); - session.graph.Dispose(); - session.Dispose(); + for (var i = 0; i < 1024; i++) + { + using var sess = Session.LoadFromSavedModel(ClassifierModelPath); } } } diff --git a/src/TensorFlowNet.Benchmarks/Program.cs b/src/TensorFlowNet.Benchmarks/Program.cs index 598d7a03..22abf730 100644 --- a/src/TensorFlowNet.Benchmarks/Program.cs +++ b/src/TensorFlowNet.Benchmarks/Program.cs @@ -13,7 +13,9 @@ namespace TensorFlowBenchmark static void Main(string[] args) { print(tf.VERSION); - /*new RepeatDataSetCrash().Run(); + + /*new SavedModelCleanup().Run(); + new RepeatDataSetCrash().Run(); new GpuLeakByCNN().Run();*/ if (args?.Length > 0) diff --git a/src/TensorFlowNet.Benchmarks/Tensorflow.Benchmark.csproj b/src/TensorFlowNet.Benchmarks/Tensorflow.Benchmark.csproj index ea799b02..ceba6cbb 100644 --- a/src/TensorFlowNet.Benchmarks/Tensorflow.Benchmark.csproj +++ b/src/TensorFlowNet.Benchmarks/Tensorflow.Benchmark.csproj @@ -37,7 +37,7 @@ - + From f3102b9be76fe0adafbc3b4f9da5d48263b8e4b4 Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Sat, 4 Sep 2021 09:39:35 -0500 Subject: [PATCH 4/4] Release v0.60.3. --- TensorFlow.NET.sln | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/TensorFlow.NET.sln b/TensorFlow.NET.sln index 36034437..8846d5bf 100644 --- a/TensorFlow.NET.sln +++ b/TensorFlow.NET.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31423.177 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31624.102 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Binding", "src\TensorFlowNET.Core\Tensorflow.Binding.csproj", "{FD682AC0-7B2D-45D3-8B0D-C6D678B04144}" EndProject @@ -77,8 +77,8 @@ Global {03F06299-3F4B-4449-A709-3A647657BC0C}.Debug|x86.Build.0 = Debug|Any CPU {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|Any CPU.ActiveCfg = Release|Any CPU {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|Any CPU.Build.0 = Release|Any CPU - {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x64.ActiveCfg = Release|Any CPU - {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x64.Build.0 = Release|Any CPU + {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x64.ActiveCfg = Release|x64 + {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x64.Build.0 = Release|x64 {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x86.ActiveCfg = Release|Any CPU {03F06299-3F4B-4449-A709-3A647657BC0C}.Release|x86.Build.0 = Release|Any CPU {49D71826-C03D-4FA7-9BAC-22C1327E65CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -101,8 +101,8 @@ Global {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Debug|x86.Build.0 = Debug|Any CPU {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|Any CPU.ActiveCfg = Release|Any CPU {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|Any CPU.Build.0 = Release|Any CPU - {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x64.ActiveCfg = Release|Any CPU - {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x64.Build.0 = Release|Any CPU + {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x64.ActiveCfg = Release|x64 + {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x64.Build.0 = Release|x64 {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x86.ActiveCfg = Release|Any CPU {1AB8108D-4FFE-4A16-88E7-328EAF686370}.Release|x86.Build.0 = Release|Any CPU {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -113,8 +113,8 @@ Global {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Debug|x86.Build.0 = Debug|Any CPU {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|Any CPU.ActiveCfg = Release|Any CPU {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|Any CPU.Build.0 = Release|Any CPU - {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x64.ActiveCfg = Release|Any CPU - {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x64.Build.0 = Release|Any CPU + {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x64.ActiveCfg = Release|x64 + {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x64.Build.0 = Release|x64 {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x86.ActiveCfg = Release|Any CPU {F17AAECB-960A-4E18-A270-BAD776F0E55B}.Release|x86.Build.0 = Release|Any CPU {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -125,8 +125,8 @@ Global {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Debug|x86.Build.0 = Debug|Any CPU {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|Any CPU.ActiveCfg = Release|Any CPU {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|Any CPU.Build.0 = Release|Any CPU - {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x64.ActiveCfg = Release|Any CPU - {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x64.Build.0 = Release|Any CPU + {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x64.ActiveCfg = Release|x64 + {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x64.Build.0 = Release|x64 {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x86.ActiveCfg = Release|Any CPU {84CA35F8-99FC-408E-8DF3-5AA175E5EFD3}.Release|x86.Build.0 = Release|Any CPU {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -137,8 +137,8 @@ Global {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Debug|x86.Build.0 = Debug|Any CPU {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|Any CPU.Build.0 = Release|Any CPU - {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.ActiveCfg = Release|Any CPU - {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.Build.0 = Release|Any CPU + {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.ActiveCfg = Release|x64 + {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x64.Build.0 = Release|x64 {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x86.ActiveCfg = Release|Any CPU {79EB56DF-E29E-4AE2-A7D9-FE403FD919BA}.Release|x86.Build.0 = Release|Any CPU {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -149,8 +149,8 @@ Global {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Debug|x86.Build.0 = Debug|Any CPU {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|Any CPU.Build.0 = Release|Any CPU - {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x64.ActiveCfg = Release|Any CPU - {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x64.Build.0 = Release|Any CPU + {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x64.ActiveCfg = Release|x64 + {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x64.Build.0 = Release|x64 {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x86.ActiveCfg = Release|Any CPU {3F5388FF-FBB4-462B-8F6F-829FFBAEB8A3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection