Skip to content

Commit e3034fa

Browse files
committed
add Resolve() to gradient.
1 parent 4a74d8d commit e3034fa

8 files changed

Lines changed: 56 additions & 40 deletions

File tree

src/TensorFlowNET.Console/Program.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ static void Main(string[] args)
1515
int batchSize = 1000;
1616

1717
// 1 million float tensor 58.5M.
18-
// mm.Execute(10, 100 * batchSize, cases.Constant);
18+
mm.Execute(10, 100 * batchSize, cases.Constant);
1919

2020
// 100K float variable 80.5M.
21-
//mm.Execute(10, 10 * batchSize, cases.Variable);
21+
mm.Execute(10, 10 * batchSize, cases.Variable);
2222

2323
// 1 million math add 36.5M.
24-
// mm.Execute(10, 100 * batchSize, cases.MathAdd);
24+
mm.Execute(10, 100 * batchSize, cases.MathAdd);
2525

26-
// 100K gradient 211M.
27-
mm.Execute(100, 1 * batchSize, cases.Gradient);
26+
// 100K gradient 210M.
27+
mm.Execute(10, 10 * batchSize, cases.Gradient);
2828

2929
Console.WriteLine("Finished.");
3030
Console.ReadLine();

src/TensorFlowNET.Core/Eager/EagerTensor.Creation.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Text;
5-
using Tensorflow.Gradients;
5+
using static Tensorflow.Binding;
66

77
namespace Tensorflow.Eager
88
{
@@ -11,15 +11,12 @@ public partial class EagerTensor : Tensor
1111
public EagerTensor() : base(IntPtr.Zero)
1212
{
1313
EagerTensorHandle = c_api.TFE_NewEagerTensor();
14-
// _id = c_api.TFE_EagerTensorId(EagerTensorHandle);
15-
// print($"new EagerTensorHandle {EagerTensorHandle.ToString("x16")} {Id}");
1614
}
1715

1816
public EagerTensor(IntPtr handle) : base(IntPtr.Zero)
1917
{
2018
EagerTensorHandle = handle;
2119
Resolve();
22-
// print($"new EagerTensorHandle {EagerTensorHandle.ToString("x16")} {Id}");
2320
}
2421

2522
public EagerTensor(string value, string device_name) : base(value)
@@ -28,7 +25,6 @@ public EagerTensor(string value, string device_name) : base(value)
2825
tfe_tensor_handle = c_api.TFE_NewTensorHandle(_handle, status);
2926
c_api.TFE_SetEagerTensorHandle(EagerTensorHandle, tfe_tensor_handle);
3027
Resolve();
31-
// print($"new EagerTensorHandle {EagerTensorHandle.ToString("x16")} {Id}");
3228
}
3329

3430
public EagerTensor(NDArray value, string device_name) : base(value)
@@ -37,18 +33,21 @@ public EagerTensor(NDArray value, string device_name) : base(value)
3733
tfe_tensor_handle = c_api.TFE_NewTensorHandle(_handle, status);
3834
c_api.TFE_SetEagerTensorHandle(EagerTensorHandle, tfe_tensor_handle);
3935
Resolve();
40-
// print($"new EagerTensorHandle {EagerTensorHandle.ToString("x16")} {Id}");
4136
}
4237

4338
public EagerTensor Resolve()
4439
{
40+
_id = c_api.TFE_EagerTensorId(EagerTensorHandle);
41+
4542
if (tfe_tensor_handle == IntPtr.Zero)
4643
tfe_tensor_handle = c_api.TFE_EagerTensorHandle(EagerTensorHandle);
4744

4845
if (_handle == IntPtr.Zero)
4946
_handle = c_api.TFE_TensorHandleResolve(tfe_tensor_handle, status);
5047

51-
_id = c_api.TFE_EagerTensorId(EagerTensorHandle);
48+
/*print($"new Tensor {Id} {_handle.ToString("x16")}");
49+
print($"new TensorHandle {Id} {tfe_tensor_handle.ToString("x16")}");
50+
print($"new EagerTensor {Id} {EagerTensorHandle.ToString("x16")}");*/
5251

5352
GarbageCollector.Increase(_handle, GCItemType.TensorHandle);
5453
GarbageCollector.Increase(tfe_tensor_handle, GCItemType.LocalTensorHandle);
@@ -62,6 +61,12 @@ protected override void DisposeUnmanagedResources(IntPtr handle)
6261
GarbageCollector.Decrease(_handle);
6362
GarbageCollector.Decrease(tfe_tensor_handle);
6463
GarbageCollector.Decrease(EagerTensorHandle);
64+
65+
/*c_api.TF_DeleteTensor(_handle);
66+
print($"deleting DeleteTensorHandle {Id} {tfe_tensor_handle.ToString("x16")}");
67+
c_api.TFE_DeleteTensorHandle(tfe_tensor_handle);
68+
print($"deleting DeleteEagerTensor {Id} {EagerTensorHandle.ToString("x16")}");
69+
c_api.TFE_DeleteEagerTensor(EagerTensorHandle);*/
6570
}
6671
}
6772
}

src/TensorFlowNET.Core/Eager/EagerTensor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public partial class EagerTensor : Tensor
1313
public IntPtr EagerTensorHandle { get; set; }
1414
public override string Device => c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(tfe_tensor_handle, status));
1515

16-
public override int rank => c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, status);
16+
// public override int rank => c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, status);
1717

1818
public static int GetRank(IntPtr handle)
1919
{

src/TensorFlowNET.Core/Gradients/GradientTape.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Tensor gradient(Tensor target, Tensor source)
8484
new [] { (source as EagerTensor).EagerTensorHandle }, 1,
8585
results.Select(x => x.EagerTensorHandle).ToArray(), results.Length);
8686
status.Check(true);
87-
return results[0];
87+
return results[0].Resolve();
8888
}
8989

9090
public unsafe (Tensor, Tensor) gradient(Tensor target, (ResourceVariable, ResourceVariable) sources)
@@ -116,7 +116,7 @@ target as EagerTensor
116116
_tape = null;
117117
}
118118

119-
return (results[0], results[1]);
119+
return (results[0].Resolve(), results[1].Resolve());
120120
}
121121

122122
public void Dispose()

src/TensorFlowNET.Core/Operations/gen_array_ops.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ s1 as EagerTensor
314314
}, 2, null,
315315
results.Select(x => x.EagerTensorHandle).ToArray(), results.Length);
316316
status.Check(true);
317-
return (results[0], results[1]);
317+
return (results[0].Resolve(), results[1].Resolve());
318318
}
319319

320320
var _op = _op_def_lib._apply_op_helper("BroadcastGradientArgs", name, new { s0, s1 });

src/TensorFlowNET.Core/Operations/gen_math_ops.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@ public static Tensor add_n(Tensor[] inputs, string name = null)
5959
return _op.outputs[0];
6060
}
6161

62-
public static EagerTensor add_n(IntPtr[] inputs, string name = null)
62+
public static IntPtr add_n(IntPtr[] inputs, string name = null)
6363
{
64-
var results = new[] { new EagerTensor() };
64+
var results = new[] { c_api.TFE_NewEagerTensor() };
6565
Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name,
6666
"AddN", name,
6767
inputs, inputs.Length,
6868
null,
69-
results.Select(x => x.EagerTensorHandle).ToArray(), results.Length);
69+
results, results.Length);
7070
status.Check(true);
71-
return results[0].Resolve();
71+
return results[0];
7272
}
7373

7474
/// <summary>
@@ -155,7 +155,7 @@ axis as EagerTensor
155155
op => wrap_tfe_src.SetOpAttrs(op, "keep_dims", keep_dims),
156156
results.Select(x => x.EagerTensorHandle).ToArray(), results.Length);
157157
status.Check(true);
158-
return results[0];
158+
return results[0].Resolve();
159159
}
160160

161161
var _op = _op_def_lib._apply_op_helper("Mean", name, args: new { input, reduction_indices = axis, keep_dims = keep_dims });

src/TensorFlowNET.Core/System/GarbageCollector.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,33 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
57
using System.Timers;
8+
using static Tensorflow.Binding;
69

710
namespace Tensorflow
811
{
912
public class GarbageCollector
1013
{
1114
static Dictionary<IntPtr, GCItemCounter> container = new Dictionary<IntPtr, GCItemCounter>();
12-
static Timer timer = null;
13-
static object locker = new object();
1415

15-
public static void Increase(IntPtr handle, GCItemType type)
16+
static object locker = new object();
17+
public static void Init()
1618
{
17-
if(timer == null)
19+
Task.Run(() =>
1820
{
19-
timer = new Timer(300);
20-
// Hook up the Elapsed event for the timer.
21-
timer.Elapsed += OnTimedEvent;
22-
timer.AutoReset = true;
23-
timer.Enabled = true;
24-
}
21+
while (true)
22+
{
23+
Thread.Sleep(100);
24+
Recycle();
25+
}
26+
});
2527

28+
}
29+
30+
public static void Increase(IntPtr handle, GCItemType type)
31+
{
2632
if (container.ContainsKey(handle))
2733
{
2834
container[handle].RefCounter++;
@@ -52,15 +58,13 @@ public static void Decrease(IntPtr handle)
5258
}
5359
}
5460

55-
private static void OnTimedEvent(object source, ElapsedEventArgs e)
61+
private static void Recycle()
5662
{
57-
timer.Stop();
58-
5963
// dispose before 1 sec
6064
lock (locker)
6165
{
6266
var items = container.Values
63-
.Where(x => x.RefCounter <= 0 && (DateTime.Now - x.LastUpdateTime).Milliseconds > 300)
67+
.Where(x => x.RefCounter <= 0 && (DateTime.Now - x.LastUpdateTime).TotalMilliseconds > 100)
6468
.ToArray();
6569

6670
foreach (var item in items)
@@ -70,21 +74,22 @@ private static void OnTimedEvent(object source, ElapsedEventArgs e)
7074
switch (item.ItemType)
7175
{
7276
case GCItemType.TensorHandle:
77+
// print($"c_api.TF_DeleteTensor({item.Handle.ToString("x16")})");
7378
c_api.TF_DeleteTensor(item.Handle);
7479
break;
7580
case GCItemType.LocalTensorHandle:
81+
// print($"c_api.TFE_DeleteTensorHandle({item.Handle.ToString("x16")})");
7682
c_api.TFE_DeleteTensorHandle(item.Handle);
7783
break;
7884
case GCItemType.EagerTensorHandle:
85+
// print($"c_api.TFE_DeleteEagerTensor({item.Handle.ToString("x16")})");
7986
c_api.TFE_DeleteEagerTensor(item.Handle);
8087
break;
8188
default:
8289
break;
8390
}
8491
}
8592
}
86-
87-
timer.Start();
8893
}
8994
}
9095
}

src/TensorFlowNET.Core/tensorflow.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,26 @@ public tensorflow()
4949

5050
private unsafe void InitGradientEnvironment()
5151
{
52+
GarbageCollector.Init();
53+
5254
var vspace = c_api.VSpace_Handle((shape, dims, dtype) =>
5355
{
5456
var ones = constant_op.constant(1.0f, dtype: dtype) as EagerTensor;
5557
return ones.EagerTensorHandle;
5658
}, (gradients) =>
5759
{
58-
var input_grads = gradients.Data.Select(x => new EagerTensor(x)).ToArray();
59-
var add_n = gen_math_ops.add_n(input_grads) as EagerTensor;
60-
return add_n.EagerTensorHandle;
60+
var add_n = gen_math_ops.add_n(gradients.Data);
61+
return add_n;
6162
});
6263

6364
ops.RegisterFromAssembly();
6465
// ops.RegisterFromAssemblyEager();
6566

6667
c_api.TFE_RegisterGradientFunction((op_name, op_inputs, op_outputs, num_attrs, output_grads, skip_input_indices) =>
6768
{
69+
/*var input_tensors = new BindingArray(op_inputs);
70+
var output_tensors = new BindingArray(op_outputs);
71+
var output_grad_tensors = new BindingArray(output_grads);*/
6872
var input_tensors = new BindingTensorArray(op_inputs).Data.Select(x => new EagerTensor(x)).ToArray();
6973
var output_tensors = new BindingTensorArray(op_outputs).Data.Select(x => new EagerTensor(x)).ToArray();
7074
var output_grad_tensors = new BindingTensorArray(output_grads).Data.Select(x => new EagerTensor(x)).ToArray();
@@ -74,8 +78,10 @@ private unsafe void InitGradientEnvironment()
7478
{
7579
NumInputs = input_tensors.Length,
7680
Inputs = input_tensors,
81+
// InputHandles = input_tensors.Data,
7782
NumOutputs = output_tensors.Length,
7883
Outputs = output_tensors,
84+
// OutputHandles = output_tensors.Data,
7985
SkipInputIndices = skip_input_indices_param
8086
}, output_grad_tensors);
8187

0 commit comments

Comments
 (0)