Skip to content

Commit c4024a9

Browse files
committed
根据反馈修复代码问题;新增作业提示
1 parent 121d277 commit c4024a9

4 files changed

Lines changed: 16 additions & 62 deletions

File tree

docs/训练营作业介绍.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 特别提示
2+
3+
1. 如果大家在作业项目开发过程中发现项目本身的问题,不要修改用例代码,请及时反馈给助教。
4+
5+
2. 建议大家尽量独立完成作业,完成用例的同时做到"最小化修改",原则上在作业要求注释的位置开发即可。另外,作业报告内可以写下对代码实现的理解、算法或者系统的示意图以及开发过程中的问题记录,形式不限。
6+
17
# 本地自测
28

39
1. 拉取代码仓库 ``git clone git@github.com:InfiniTensor/TinyInfiniTrain.git --recursive``

infini_train/src/autograd/function.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ std::vector<std::shared_ptr<Tensor>> Function::Apply(const std::vector<std::shar
5858
auto &output_tensor = output_tensors[output_idx];
5959
output_tensor->set_requires_grad(output_requires_grad);
6060
output_tensor->set_is_leaf(false);
61-
output_tensor->set_grad_fn(shared_from_this());
61+
output_tensor->set_grad_fn(output_requires_grad ? shared_from_this() : nullptr);
6262
output_tensor->set_output_idx(output_idx);
6363
}
6464

@@ -77,8 +77,8 @@ void Function::BackwardPartial(const std::shared_ptr<Tensor> &grad_output, int g
7777
if (grad_outputs_reached_ == grad_outputs_.size()
7878
&& (dependencies_reached_ == dependencies_number_ || dependencies_number_ == 0)) {
7979
auto grad_inputs = Backward(grad_outputs_);
80-
// saved_tensors_.clear();
81-
// grad_outputs_.clear();
80+
saved_tensors_.clear();
81+
grad_outputs_.clear();
8282
CHECK_EQ(grad_inputs.size(), next_functions_.size());
8383
for (int idx = 0; idx < grad_inputs.size(); ++idx) {
8484
auto &grad_input = grad_inputs[idx];

test/optimizer/test_adam.cc

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -58,59 +58,3 @@ TEST(AdamOptimizerTest, MomentumAccumulation) {
5858
EXPECT_NEAR(param_history[t-1] - 1.0f, expected_update, 1e-5);
5959
}
6060
}
61-
62-
#ifdef USE_CUDA
63-
64-
TEST(AdamOptimizerTest, BasicParameterUpdateCuda) {
65-
auto param = std::make_shared<Tensor>(std::vector<int64_t>{3}, DataType::kFLOAT32,
66-
Device(DeviceType::kCUDA, 0));
67-
param->Fill(1.0f); // 初始参数值 [1.0, 1.0, 1.0]
68-
param->RequiresGrad();
69-
70-
auto grad = std::make_shared<Tensor>(param->Dims(), param->Dtype());
71-
grad->Fill(1.0f);
72-
float* grad_data = static_cast<float*>(param->grad()->DataPtr());
73-
std::memcpy(grad_data, grad->DataPtr(), grad->SizeInBytes());
74-
75-
optimizers::Adam optimizer({param}, 0.001f, 0.9f, 0.999f, 1e-8);
76-
77-
optimizer.Step();
78-
79-
float* param_data = static_cast<float*>(param->DataPtr());
80-
for (int i = 0; i < 3; ++i) {
81-
EXPECT_LT(param_data[i], 1.0f); // 参数值应该减小
82-
}
83-
}
84-
85-
TEST(AdamOptimizerTest, MomentumAccumulationCuda) {
86-
auto param = std::make_shared<Tensor>(std::vector<int64_t>{1}, DataType::kFLOAT32,
87-
Device(DeviceType::kCUDA, 0));
88-
param->Fill(1.0f);
89-
param->RequiresGrad();
90-
param->grad()->Fill(0.5f);
91-
92-
float learning_rate = 1e-3, beta1 = 0.9, beta2 = 0.999, eps = 1e-8;
93-
94-
optimizers::Adam optimizer({param}, learning_rate, beta1, beta2, eps);
95-
96-
std::vector<float> param_history;
97-
for (int i = 0; i < 3; ++i) {
98-
optimizer.Step();
99-
param_history.push_back(static_cast<float*>(param->DataPtr())[0]);
100-
}
101-
102-
EXPECT_LT(param_history[1], param_history[0]);
103-
EXPECT_LT(param_history[2], param_history[1]);
104-
105-
float m = 0, v = 0, expected_update = 0;
106-
for (int t = 1; t <= 3; ++t) {
107-
m = beta1 * m + (1 - beta1) * 0.5f; // 一阶动量
108-
v = beta2 * v + (1 - beta2) * 0.25f; // 二阶动量
109-
float m_hat = m / (1.0f - std::pow(beta1, t)); // 动态校正因子
110-
float v_hat = v / (1.0f - std::pow(beta2, t));
111-
112-
expected_update -= learning_rate * m_hat / (std::sqrt(v_hat) + 1e-8f);
113-
EXPECT_NEAR(param_history[t-1] - 1.0f, expected_update, 1e-5);
114-
}
115-
}
116-
#endif

test/optimizer/test_adam_cuda.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include<iostream>
33
#include<vector>
44

5+
#include "cuda_runtime_api.h"
6+
57
#include "gtest/gtest.h"
68
#include "infini_train/include/tensor.h"
79
#include "infini_train/include/device.h"
@@ -18,13 +20,14 @@ TEST(AdamOptimizerTest, BasicParameterUpdateCuda) {
1820
auto grad = std::make_shared<Tensor>(param->Dims(), param->Dtype());
1921
grad->Fill(1.0f);
2022
float* grad_data = static_cast<float*>(param->grad()->DataPtr());
21-
std::memcpy(grad_data, grad->DataPtr(), grad->SizeInBytes());
23+
cudaMemcpy(grad_data, grad->DataPtr(), grad->SizeInBytes(), cudaMemcpyDefault);
2224

2325
optimizers::Adam optimizer({param}, 0.001f, 0.9f, 0.999f, 1e-8);
2426

2527
optimizer.Step();
2628

27-
float* param_data = static_cast<float*>(param->DataPtr());
29+
auto param_cpu = param->To(Device(DeviceType::kCPU, 0));
30+
float* param_data = static_cast<float*>(param_cpu.DataPtr());
2831
for (int i = 0; i < 3; ++i) {
2932
EXPECT_LT(param_data[i], 1.0f); // 参数值应该减小
3033
}
@@ -44,7 +47,8 @@ TEST(AdamOptimizerTest, MomentumAccumulationCuda) {
4447
std::vector<float> param_history;
4548
for (int i = 0; i < 3; ++i) {
4649
optimizer.Step();
47-
param_history.push_back(static_cast<float*>(param->DataPtr())[0]);
50+
auto param_cpu = param->To(Device(DeviceType::kCPU, 0));
51+
param_history.push_back(static_cast<float*>(param_cpu.DataPtr())[0]);
4852
}
4953

5054
EXPECT_LT(param_history[1], param_history[0]);

0 commit comments

Comments
 (0)