Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions include/infinicore/ops/broadcast_to.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include "../device.hpp"
#include "common/op.hpp"
#include <vector>

namespace infinicore::op {
class BroadcastTo {
public:
// Schema: Output(y), Input(x)
using schema = void (*)(Tensor, Tensor);
static void execute(Tensor y, Tensor x);
static common::OpDispatcher<schema> &dispatcher();
};
Tensor broadcast_to(Tensor x, const std::vector<int64_t>& shape);
void broadcast_to_(Tensor y, Tensor x);

} // namespace infinicore::op
21 changes: 21 additions & 0 deletions include/infinicore/ops/huber_loss.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

#include "../device.hpp"
#include "common/op.hpp"

namespace infinicore::op {

class HuberLoss {
public:
// Schema: output, input, target, delta, reduction
using schema = void (*)(Tensor, Tensor, Tensor, float, int64_t);

static void execute(Tensor output, Tensor input, Tensor target, float delta, int64_t reduction);
static common::OpDispatcher<schema> &dispatcher();
};

// delta 默认为 1.0f,reduction 默认为 1 (MEAN)
Tensor huber_loss(Tensor input, Tensor target, float delta = 1.0f, int64_t reduction = 1);
void huber_loss_(Tensor output, Tensor input, Tensor target, float delta, int64_t reduction);

} // namespace infinicore::op
1 change: 1 addition & 0 deletions include/infinicore/ops/linear.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "common/op.hpp"
#include <optional>


namespace infinicore::op {

Tensor linear(Tensor input, Tensor weight, std::optional<Tensor> bias);
Expand Down
20 changes: 20 additions & 0 deletions include/infinicore/ops/softplus.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#include "../device.hpp"
#include "common/op.hpp"

namespace infinicore::op {

class Softplus {
public:
// 修改 1: Schema 增加 float beta, float threshold
using schema = void (*)(Tensor, Tensor, float, float);
static void execute(Tensor y, Tensor x, float beta, float threshold);
static common::OpDispatcher<schema> &dispatcher();
};
// default: beta = 1.0, threshold = 20.0
Tensor softplus(Tensor x, float beta = 1.0f, float threshold = 20.0f);

void softplus_(Tensor y, Tensor x, float beta = 1.0f, float threshold = 20.0f);

} // namespace infinicore::op
16 changes: 16 additions & 0 deletions include/infinicore/ops/softsign.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include "../device.hpp"
#include "common/op.hpp"

namespace infinicore::op {
class Softsign {
public:
using schema = void (*)(Tensor, Tensor);
static void execute(Tensor y, Tensor x);
static common::OpDispatcher<schema> &dispatcher();
};
// 返回新 Tensor 的函数接口
Tensor softsign(Tensor x);
void softsign_(Tensor y, Tensor x);
} // namespace infinicore::op
5 changes: 4 additions & 1 deletion include/infiniop.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,16 @@
#include "infiniop/ops/sigmoid.h"
#include "infiniop/ops/silu.h"
#include "infiniop/ops/softmax.h"
#include "infiniop/ops/softplus.h"
#include "infiniop/ops/sub.h"
#include "infiniop/ops/swiglu.h"
#include "infiniop/ops/tanh.h"
#include "infiniop/ops/topkrouter.h"
#include "infiniop/ops/topksoftmax.h"
#include "infiniop/ops/zeros.h"
#include "infiniop/ops/broadcast_to.h"
#include "infiniop/ops/softplus.h"
#include "infiniop/ops/softsign.h"
#include "infiniop/ops/huber_loss.h"
#include "infiniop/tensor_descriptor.h"

#endif // __INFINIOP_API_H__
24 changes: 24 additions & 0 deletions include/infiniop/ops/broadcast_to.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef __INFINIOP_BROADCAST_TO_API_H__
#define __INFINIOP_BROADCAST_TO_API_H__

#include "../operator_descriptor.h"

typedef struct InfiniopDescriptor *infiniopBroadcastToDescriptor_t;

__C __export infiniStatus_t infiniopCreateBroadcastToDescriptor(infiniopHandle_t handle,
infiniopBroadcastToDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t y,
infiniopTensorDescriptor_t x);

__C __export infiniStatus_t infiniopGetBroadcastToWorkspaceSize(infiniopBroadcastToDescriptor_t desc, size_t *size);

__C __export infiniStatus_t infiniopBroadcastTo(infiniopBroadcastToDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *y,
const void *x,
void *stream);

__C __export infiniStatus_t infiniopDestroyBroadcastToDescriptor(infiniopBroadcastToDescriptor_t desc);

#endif
28 changes: 28 additions & 0 deletions include/infiniop/ops/huber_loss.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#ifndef __INFINIOP_HUBER_LOSS_API_H__
#define __INFINIOP_HUBER_LOSS_API_H__

#include "../operator_descriptor.h"

typedef struct InfiniopDescriptor *infiniopHuberLossDescriptor_t;

__C __export infiniStatus_t infiniopCreateHuberLossDescriptor(infiniopHandle_t handle,
infiniopHuberLossDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t output,
infiniopTensorDescriptor_t input,
infiniopTensorDescriptor_t target,
float delta,
int reduction);

__C __export infiniStatus_t infiniopGetHuberLossWorkspaceSize(infiniopHuberLossDescriptor_t desc, size_t *size);

__C __export infiniStatus_t infiniopHuberLoss(infiniopHuberLossDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *output,
const void *input,
const void *target,
void *stream);

__C __export infiniStatus_t infiniopDestroyHuberLossDescriptor(infiniopHuberLossDescriptor_t desc);

#endif // __INFINIOP_HUBER_LOSS_API_H__
48 changes: 31 additions & 17 deletions include/infiniop/ops/softplus.h
Original file line number Diff line number Diff line change
@@ -1,24 +1,38 @@
#ifndef __INFINIOP_SOFTPLUS_API_H__
#define __INFINIOP_SOFTPLUS_API_H__
#ifndef __INFINIOP_OPS_SOFTPLUS_H__
#define __INFINIOP_OPS_SOFTPLUS_H__
#include "../tensor_descriptor.h"

#include "../operator_descriptor.h"

typedef struct InfiniopDescriptor *infiniopSoftplusDescriptor_t;
#ifdef __cplusplus
extern "C" {
#endif

__C __export infiniStatus_t infiniopCreateSoftplusDescriptor(infiniopHandle_t handle,
infiniopSoftplusDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t y,
infiniopTensorDescriptor_t x);
typedef struct InfiniopSoftplusDescriptor *infiniopSoftplusDescriptor_t;
__C __export infiniStatus_t infiniopCreateSoftplusDescriptor(
infiniopHandle_t handle,
infiniopSoftplusDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t y_desc,
infiniopTensorDescriptor_t x_desc,
float beta,
float threshold
);

__C __export infiniStatus_t infiniopGetSoftplusWorkspaceSize(infiniopSoftplusDescriptor_t desc, size_t *size);
__C __export infiniStatus_t infiniopGetSoftplusWorkspaceSize(
infiniopSoftplusDescriptor_t desc,
size_t *size);

__C __export infiniStatus_t infiniopSoftplus(infiniopSoftplusDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *y,
const void *x,
void *stream);
__C __export infiniStatus_t infiniopSoftplus(
infiniopSoftplusDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *y,
const void *x,
void *stream);

__C __export infiniStatus_t infiniopDestroySoftplusDescriptor(infiniopSoftplusDescriptor_t desc);
__C __export infiniStatus_t infiniopDestroySoftplusDescriptor(
infiniopSoftplusDescriptor_t desc);

#ifdef __cplusplus
}
#endif

#endif // __INFINIOP_OPS_SOFTPLUS_H__
25 changes: 25 additions & 0 deletions include/infiniop/ops/softsign.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

#ifndef __INFINIOP_SOFTSIGN_API_H__
#define __INFINIOP_SOFTSIGN_API_H__

#include "../operator_descriptor.h"

typedef struct InfiniopDescriptor *infiniopSoftsignDescriptor_t;

__C __export infiniStatus_t infiniopCreateSoftsignDescriptor(infiniopHandle_t handle,
infiniopSoftsignDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t y,
infiniopTensorDescriptor_t x);

__C __export infiniStatus_t infiniopGetSoftsignWorkspaceSize(infiniopSoftsignDescriptor_t desc, size_t *size);

__C __export infiniStatus_t infiniopSoftsign(infiniopSoftsignDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *y,
const void *x,
void *stream);

__C __export infiniStatus_t infiniopDestroySoftsignDescriptor(infiniopSoftsignDescriptor_t desc);

#endif
2 changes: 2 additions & 0 deletions python/infinicore/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
from infinicore.ops.rearrange import rearrange
from infinicore.ops.squeeze import squeeze
from infinicore.ops.unsqueeze import unsqueeze
from infinicore.ops.broadcast_to import broadcast_to
from infinicore.tensor import (
Tensor,
empty,
Expand Down Expand Up @@ -125,6 +126,7 @@
"paged_attention",
"paged_attention_prefill",
"ones",
"broadcast_to",
"strided_empty",
"strided_from_blob",
"zeros",
Expand Down
6 changes: 6 additions & 0 deletions python/infinicore/nn/functional/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
from .rms_norm import rms_norm
from .rope import RopeAlgo, rope
from .silu import silu
from .softplus import softplus
from .softsign import softsign
from .huber_loss import huber_loss
from .swiglu import swiglu

__all__ = [
Expand All @@ -17,4 +20,7 @@
"embedding",
"rope",
"RopeAlgo",
"softplus",
"siftsign",
"huber_loss",
]
50 changes: 50 additions & 0 deletions python/infinicore/nn/functional/huber_loss.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from typing import Optional
from infinicore.lib import _infinicore
from infinicore.tensor import Tensor

_REDUCTION_MODES = {
"none": 0,
"mean": 1,
"sum": 2,
}

def huber_loss(
input: Tensor,
target: Tensor,
delta: float = 1.0,
reduction: str = "mean",
*,
out: Optional[Tensor] = None
) -> Tensor:
r"""Creates a criterion that uses a squared term if the absolute
element-wise error falls below delta and a delta-scaled L1 term otherwise.
"""

if not input.is_contiguous():
input = input.contiguous()
if not target.is_contiguous():
target = target.contiguous()

# 解析 reduction 参数
if reduction not in _REDUCTION_MODES:
raise ValueError(f"{reduction} is not a valid value for reduction")
reduction_val = _REDUCTION_MODES[reduction]

if out is not None:
_infinicore.huber_loss_(
out._underlying,
input._underlying,
target._underlying,
delta,
reduction_val
)
return out

return Tensor(
_infinicore.huber_loss(
input._underlying,
target._underlying,
delta,
reduction_val
)
)
3 changes: 3 additions & 0 deletions python/infinicore/nn/functional/linear.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from infinicore.lib import _infinicore
from infinicore.tensor import Tensor

__all__ = ["linear"]



def linear(input: Tensor, weight: Tensor, bias=None, *, out=None) -> Tensor:
r"""Applies a linear transformation to the incoming data: y=xA^T+b."""
Expand Down
13 changes: 13 additions & 0 deletions python/infinicore/nn/functional/softplus.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from infinicore.lib import _infinicore
from infinicore.tensor import Tensor


def softplus(input, beta=1, threshold=20, *, out=None):
if out is None:
# 修改:将 beta 和 threshold 传递给底层 C++
return Tensor(_infinicore.softplus(input._underlying, beta, threshold))

# 修改:将 beta 和 threshold 传递给底层 C++ (In-place)
_infinicore.softplus_(out._underlying, input._underlying, beta, threshold)

return out
11 changes: 11 additions & 0 deletions python/infinicore/nn/functional/softsign.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from infinicore.lib import _infinicore
from infinicore.tensor import Tensor


def softsign(input, *, out=None):
if out is None:
return Tensor(_infinicore.softsign(input._underlying))

_infinicore.softsign_(out._underlying, input._underlying)

return out
11 changes: 11 additions & 0 deletions python/infinicore/ops/broadcast_to.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from infinicore.lib import _infinicore
from infinicore.tensor import Tensor

# 修改说明:将参数名 'shape' 改为 'size',以匹配测试用例中的调用方式 kwargs={size=...}
def broadcast_to(input, size, *, out=None):
if out is None:
return Tensor(_infinicore.broadcast_to(input._underlying, size))

_infinicore.broadcast_to_(out._underlying, input._underlying)

return out
Loading